|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] tools/libxl: Improvements to libxl-save-helper when using valgrind
Fix two unfree()'d allocations in libxl-save-helper, to get them out of the
way of other legitimate complains from valgrind.
The first is easy; close the interface to libxc when done with it.
The second requires quite a bit of code motion to fix sensibly.
* The three logging functions are moved up. The destroy() function has been
modified to be less antisocial.
* The global 'logger' is initialised in place. This requires changing the
indirection of its use in 5 locations.
* The struct xentoollog_logger_tellparent and function
createlogger_tellparent() are unused and removed.
This completely removes any memory allocation associated with logging
Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CC: Ian Campbell <Ian.Campbell@xxxxxxxxxx>
CC: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
---
The macro XTL_NEW_LOGGER() is a special kind of crazy, requiring types and
functions with magic names to appear in scope. It is also complete overkill
for libxl-save-helpers use.
---
tools/libxl/libxl_save_helper.c | 87 +++++++++++++++++----------------------
1 file changed, 37 insertions(+), 50 deletions(-)
diff --git a/tools/libxl/libxl_save_helper.c b/tools/libxl/libxl_save_helper.c
index 880565e..7daff8e 100644
--- a/tools/libxl/libxl_save_helper.c
+++ b/tools/libxl/libxl_save_helper.c
@@ -47,10 +47,41 @@
#include "xenguest.h"
#include "_libxl_save_msgs_helper.h"
+/*----- logger -----*/
+static void tellparent_vmessage(xentoollog_logger *logger_in,
+ xentoollog_level level,
+ int errnoval,
+ const char *context,
+ const char *format,
+ va_list al)
+{
+ char *formatted;
+ int r = vasprintf(&formatted, format, al);
+ if (r < 0) { perror("memory allocation failed during logging"); exit(-1); }
+ helper_stub_log(level, errnoval, context, formatted, 0);
+ free(formatted);
+}
+
+static void tellparent_progress(struct xentoollog_logger *logger_in,
+ const char *context,
+ const char *doing_what, int percent,
+ unsigned long done, unsigned long total)
+{
+ helper_stub_progress(context, doing_what, done, total, 0);
+}
+
+static void tellparent_destroy(struct xentoollog_logger *logger_in)
+{
+}
+
/*----- globals -----*/
static const char *program = "libxl-save-helper";
-static xentoollog_logger *logger;
+static xentoollog_logger logger = {
+ tellparent_vmessage,
+ tellparent_progress,
+ tellparent_destroy
+ };
static xc_interface *xch;
/*----- error handling -----*/
@@ -61,7 +92,7 @@ static void fail(int errnoval, const char *fmt, ...)
{
va_list al;
va_start(al,fmt);
- xtl_logv(logger,XTL_ERROR,errnoval,program,fmt,al);
+ xtl_logv(&logger,XTL_ERROR,errnoval,program,fmt,al);
exit(-1);
}
@@ -86,45 +117,6 @@ static void *xmalloc(size_t sz)
return r;
}
-/*----- logger -----*/
-
-typedef struct {
- xentoollog_logger vtable;
-} xentoollog_logger_tellparent;
-
-static void tellparent_vmessage(xentoollog_logger *logger_in,
- xentoollog_level level,
- int errnoval,
- const char *context,
- const char *format,
- va_list al)
-{
- char *formatted;
- int r = vasprintf(&formatted, format, al);
- if (r < 0) { perror("memory allocation failed during logging"); exit(-1); }
- helper_stub_log(level, errnoval, context, formatted, 0);
- free(formatted);
-}
-
-static void tellparent_progress(struct xentoollog_logger *logger_in,
- const char *context,
- const char *doing_what, int percent,
- unsigned long done, unsigned long total)
-{
- helper_stub_progress(context, doing_what, done, total, 0);
-}
-
-static void tellparent_destroy(struct xentoollog_logger *logger_in)
-{
- abort();
-}
-
-static xentoollog_logger_tellparent *createlogger_tellparent(void)
-{
- xentoollog_logger_tellparent newlogger;
- return XTL_NEW_LOGGER(tellparent, newlogger);
-}
-
/*----- helper functions called by autogenerated stubs -----*/
unsigned char * helper_allocbuf(int len, void *user)
@@ -184,22 +176,17 @@ static int toolstack_save_cb(uint32_t domid, uint8_t
**buf,
}
static void startup(const char *op) {
- logger = (xentoollog_logger*)createlogger_tellparent();
- if (!logger) {
- fprintf(stderr, "%s: cannot initialise logger\n", program);
- exit(-1);
- }
-
- xtl_log(logger,XTL_DEBUG,0,program,"starting %s",op);
+ xtl_log(&logger,XTL_DEBUG,0,program,"starting %s",op);
- xch = xc_interface_open(logger,logger,0);
+ xch = xc_interface_open(&logger,&logger,0);
if (!xch) fail(errno,"xc_interface_open failed");
}
static void complete(int retval) {
int errnoval = retval ? errno : 0; /* suppress irrelevant errnos */
- xtl_log(logger,XTL_DEBUG,errnoval,program,"complete r=%d",retval);
+ xtl_log(&logger,XTL_DEBUG,errnoval,program,"complete r=%d",retval);
helper_stub_complete(retval,errnoval,0);
+ xc_interface_close(xch);
exit(0);
}
--
1.7.10.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |