On Thu, 2013-04-11 at 20:35 +0100, Jim Fehlig wrote:> On 04/11/2013 07:09 AM, Ian Campbell wrote:
> > On Thu, 2013-04-11 at 13:46 +0100, Ian Campbell wrote:
> >> Hi Jim,
> >>
> >> I don''t see any calls to libxl_event_dispose in
libvirt.git,
> > actually I think I meant libxl_event_free, but I can''t see
that either.
>
> Right. I confirmed that was needed with Ian J. a few weeks (months) back,
but
> then never submitted a patch. I''ve attached one, but noticed that
the prototype
> of the event_occurs callback defines the event parameter as const, causing
this
> error without the lame cast
>
> cc1: warnings being treated as errors
> libxl/libxl_driver.c: In function ''libxlEventHandler'':
> libxl/libxl_driver.c:760: error: passing argument 2 of
''libxl_event_free''
> discards qualifiers from pointer target type
>
> Shouldn''t the callback in libxl_event.h just be
>
> void (*event_occurs)(void *user, libxl_event *event);
Yes, given the comment that the event becomes owned by and must be freed
by the application I think it has to be.
> But I suppose we can''t change that.
Ugh, you really can''t assign a function with a const parameter to a
function pointer without the const. Or at least gcc complains I didn''t
look at the C spec... How annoying! I was hoping that we could just nuke
the const in the callback definition and suggest that applications which
want to support the 4.2 API keep the cast.
We do have the LIBXL_API_VERSION infrastructure to help us in these
situations, something like the patch below...
> BTW, the const''ness of event led me to believe it didn''t
need freed.
As well it might!
Ian.
8<----------------------
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
index d18d22c..3a68819 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -266,9 +266,9 @@
#include <libxl_uuid.h>
#include <_libxl_list.h>
-/* API compatibility. Only 0x040200 is supported at this time. */
+/* API compatibility. */
#ifdef LIBXL_API_VERSION
-#if LIBXL_API_VERSION != 0x040200
+#if LIBXL_API_VERSION != 0x040200 && LIBXL_API_VERSION != 0x040300
#error Unknown LIBXL_API_VERSION
#endif
#endif
@@ -289,6 +289,16 @@
*/
#define LIBXL_HAVE_BUILDINFO_USBDEVICE_LIST 1
+/*
+ * LIBXL_HAVE_NONCONST_EVENT_OCCURS_EVENT_ARG
+ *
+ * This argument was erroneously "const" in the 4.2 release despite
+ * the requirement for the callback to free the event.
+ */
+#if LIBXL_API_VERSION != 0x040200
+#define LIBXL_HAVE_NONCONST_EVENT_OCCURS_EVENT_ARG 1
+#endif
+
/* Functions annotated with LIBXL_EXTERNAL_CALLERS_ONLY may not be
* called from within libxl itself. Callers outside libxl, who
* do not #include libxl_internal.h, are fine. */
diff --git a/tools/libxl/libxl_event.h b/tools/libxl/libxl_event.h
index 51f2721..27a65dc 100644
--- a/tools/libxl/libxl_event.h
+++ b/tools/libxl/libxl_event.h
@@ -64,7 +64,11 @@ void libxl_event_free(libxl_ctx *ctx, libxl_event *event);
typedef struct libxl_event_hooks {
uint64_t event_occurs_mask;
- void (*event_occurs)(void *user, const libxl_event *event);
+ void (*event_occurs)(void *user,
+#ifndef LIBXL_HAVE_NONCONST_EVENT_OCCURS_EVENT_ARG
+ const
+#endif
+ libxl_event *event);
void (*disaster)(void *user, libxl_event_type type,
const char *msg, int errnoval);
} libxl_event_hooks;