[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [libvirt] [Xen-devel] libvirt libxl driver leaking libxl_event's?



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);

But I suppose we can't change that. BTW, the const'ness of event led me to believe it didn't need freed.

Regards,
Jim



libxl_event.h says in relation to the event_occurs callback:
    * event becomes owned by the application and must be freed, either
    * by event_occurs or later.
so does this mean the memory referenced by event is leaked by
libxlEventHandler?

libxl_event only contains dynamic allocations for
LIBXL_EVENT_TYPE_DISK_EJECT which you don't seem to register for so the
issue is probably benign but worth noting I think.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel lists xen org
http://lists.xen.org/xen-devel



diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index 9980b38..b9e3f4d 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -697,9 +697,10 @@ libxlVmReap(libxlDriverPrivatePtr driver,
  * Handle previously registered event notification from libxenlight
  */
 static void
-libxlEventHandler(void *data ATTRIBUTE_UNUSED, const libxl_event *event)
+libxlEventHandler(void *data, const libxl_event *event)
 {
     libxlDriverPrivatePtr driver = libxl_driver;
+    libxlDomainObjPrivatePtr priv = ((virDomainObjPtr)data)->privateData;
     virDomainObjPtr vm = NULL;
     virDomainEventPtr dom_event = NULL;
     libxl_shutdown_reason xl_reason = event->u.domain_shutdown.shutdown_reason;
@@ -756,6 +757,7 @@ cleanup:
         libxlDomainEventQueue(driver, dom_event);
         libxlDriverUnlock(driver);
     }
+    libxl_event_free(priv->ctx, (libxl_event *)event);
 }
 
 static const struct libxl_event_hooks ev_hooks = {

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]