]> xenbits.xensource.com Git - libvirt.git/commitdiff
Add a virFreeCallback to virDomainEventRegister (from David Lively)
authorDaniel P. Berrange <berrange@redhat.com>
Wed, 19 Nov 2008 15:25:24 +0000 (15:25 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Wed, 19 Nov 2008 15:25:24 +0000 (15:25 +0000)
12 files changed:
ChangeLog
examples/domain-events/events-c/event-test.c
include/libvirt/libvirt.h
include/libvirt/libvirt.h.in
python/libvir.c
qemud/remote.c
src/domain_event.c
src/domain_event.h
src/driver.h
src/libvirt.c
src/qemu_driver.c
src/remote_internal.c

index 7b1dac780dc26f86b5245e98a752b8c15e856df5..c8cff8cdc0672799cc497b0e9c9e91e87304013d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+Wed Nov 19 15:25:00 GMT 2008 Daniel Berrange <berrange@redhat.com>
+
+       Add a callback for freeing the user data for callbacks
+       (patch from David Lively)
+       * include/libvirt/libvirt.h.in: Add a virFreeCallback type
+       and add it to virDomainEventRegister
+       * qemud/remote.c, src/domain_event.h, src/domain_event.c,
+       src/driver.h, src/qemu_driver.c, src/remote_internal.c,
+       python/libvirt.c: Update to call the virFreeCallback where
+       needed
+       * examples/domain-events/events-c/event-test.c: use the
+       virFreeCallback for releasing data
+
 Mon Nov 18 12:24:00 GMT 2008 Daniel Berrange <berrange@redhat.com>
 
        * src/Makefile.am: Fix build on MinGW where linker flags
index 0a741ea38a34c6068c09024151b3b44346eb55b2..11d62c7cdc4aba393039dfb52d02997105471336 100644 (file)
@@ -1,7 +1,9 @@
 #include <config.h>
 
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
+#include <signal.h>
 
 #if HAVE_SYS_POLL_H
 #include <sys/types.h>
@@ -168,6 +170,13 @@ int myDomainEventCallback2 (virConnectPtr conn ATTRIBUTE_UNUSED,
     return 0;
 }
 
+static void myFreeFunc(void *opaque)
+{
+    char *str = opaque;
+    printf("%s: Freeing [%s]\n", __FUNCTION__, str);
+    free(str);
+}
+
 
 /* EventImpl Functions */
 int myEventHandleTypeToPollEvent(virEventHandleType events)
@@ -254,15 +263,27 @@ void usage(const char *pname)
     printf("%s uri\n", pname);
 }
 
+int run = 1;
+
+static void stop(int sig)
+{
+    printf("Exiting on signal %d\n", sig);
+    run = 0;
+}
+
+
 int main(int argc, char **argv)
 {
-    int run=1;
     int sts;
+    struct sigaction action_stop = {
+        .sa_handler = stop
+    };
 
     if(argc > 1 && STREQ(argv[1],"--help")) {
         usage(argv[0]);
         return -1;
     }
+
     virEventRegisterImpl( myEventAddHandleFunc,
                           myEventUpdateHandleFunc,
                           myEventRemoveHandleFunc,
@@ -277,11 +298,16 @@ int main(int argc, char **argv)
         return -1;
     }
 
+    sigaction(SIGTERM, &action_stop, NULL);
+    sigaction(SIGINT, &action_stop, NULL);
+
     DEBUG0("Registering domain event cbs");
 
     /* Add 2 callbacks to prove this works with more than just one */
-    virConnectDomainEventRegister(dconn, myDomainEventCallback1, NULL);
-    virConnectDomainEventRegister(dconn, myDomainEventCallback2, NULL);
+    virConnectDomainEventRegister(dconn, myDomainEventCallback1,
+                                  strdup("callback 1"), myFreeFunc);
+    virConnectDomainEventRegister(dconn, myDomainEventCallback2,
+                                  strdup("callback 2"), myFreeFunc);
 
     while(run) {
         struct pollfd pfd = { .fd = h_fd,
@@ -315,9 +341,15 @@ int main(int argc, char **argv)
 
     }
 
+    DEBUG0("Deregistering event handlers");
+    virConnectDomainEventDeregister(dconn, myDomainEventCallback1);
+    virConnectDomainEventDeregister(dconn, myDomainEventCallback2);
+
+    DEBUG0("Closing connection");
     if( dconn && virConnectClose(dconn)<0 ) {
         printf("error closing\n");
     }
+
     printf("done\n");
     return 0;
 }
index d1bb154ebf78029c65508bf11fe97e5dab754e9c..c1970ab6d91b67f4b319a1ec1b9fcfb9b639a8c4 100644 (file)
@@ -1093,9 +1093,12 @@ typedef int (*virConnectDomainEventCallback)(virConnectPtr conn,
                                              int detail,
                                              void *opaque);
 
+typedef void (*virFreeCallback)(void *opaque);
+
 int virConnectDomainEventRegister(virConnectPtr conn,
                                   virConnectDomainEventCallback cb,
-                                  void *opaque);
+                                  void *opaque,
+                                  virFreeCallback freecb);
 
 int virConnectDomainEventDeregister(virConnectPtr conn,
                                     virConnectDomainEventCallback cb);
index 0ee657a2156414ae7b83aa5a9cdf30abda624fbf..d3e351d2aa8b419e9411a6deeadd17a225884aca 100644 (file)
@@ -1093,9 +1093,12 @@ typedef int (*virConnectDomainEventCallback)(virConnectPtr conn,
                                              int detail,
                                              void *opaque);
 
+typedef void (*virFreeCallback)(void *opaque);
+
 int virConnectDomainEventRegister(virConnectPtr conn,
                                   virConnectDomainEventCallback cb,
-                                  void *opaque);
+                                  void *opaque,
+                                  virFreeCallback freecb);
 
 int virConnectDomainEventDeregister(virConnectPtr conn,
                                     virConnectDomainEventCallback cb);
index 96ccb28650f5b164b5635be60d9cd3c365260ed8..3888af5b4e7723d8d917a2da10f5f6f3937b0210 100644 (file)
@@ -1651,7 +1651,7 @@ libvirt_virConnectDomainEventRegister(ATTRIBUTE_UNUSED PyObject * self,
 
     ret = virConnectDomainEventRegister(conn,
                                         libvirt_virConnectDomainEventCallback,
-                                        (void *)pyobj_conn_inst);
+                                        (void *)pyobj_conn_inst, NULL);
 
     LIBVIRT_END_ALLOW_THREADS;
 
index e9b2387e72879688bba401e5a6547164e56c30dc..68030eadade0760f5d44b8110fe07d088644e3a6 100644 (file)
@@ -3754,7 +3754,7 @@ remoteDispatchDomainEventsRegister (struct qemud_server *server ATTRIBUTE_UNUSED
 
     /* Register event delivery callback */
     REMOTE_DEBUG("%s","Registering to relay remote events");
-    virConnectDomainEventRegister(client->conn, remoteRelayDomainEvent, client);
+    virConnectDomainEventRegister(client->conn, remoteRelayDomainEvent, client, NULL);
 
     if(ret)
         ret->cb_registered = 1;
index 2d159366a0565947c4a2864ab18b8b55a92ff7b4..85ca9b7bd27194dd0707bd37d523c303eb0f0df9 100644 (file)
@@ -39,6 +39,9 @@ virDomainEventCallbackListFree(virDomainEventCallbackListPtr list)
 {
     int i;
     for (i=0; i<list->count; i++) {
+        virFreeCallback freecb = list->callbacks[i]->freecb;
+        if (freecb)
+            (*freecb)(list->callbacks[i]->opaque);
         VIR_FREE(list->callbacks[i]);
     }
     VIR_FREE(list);
@@ -60,6 +63,9 @@ virDomainEventCallbackListRemove(virConnectPtr conn,
     for (i = 0 ; i < cbList->count ; i++) {
         if(cbList->callbacks[i]->cb == callback &&
            cbList->callbacks[i]->conn == conn) {
+            virFreeCallback freecb = cbList->callbacks[i]->freecb;
+            if (freecb)
+                (*freecb)(cbList->callbacks[i]->opaque);
             virUnrefConnect(cbList->callbacks[i]->conn);
             VIR_FREE(cbList->callbacks[i]);
 
@@ -94,7 +100,8 @@ int
 virDomainEventCallbackListAdd(virConnectPtr conn,
                               virDomainEventCallbackListPtr cbList,
                               virConnectDomainEventCallback callback,
-                              void *opaque)
+                              void *opaque,
+                              virFreeCallback freecb)
 {
     virDomainEventCallbackPtr event;
     int n;
@@ -120,6 +127,7 @@ virDomainEventCallbackListAdd(virConnectPtr conn,
     event->conn = conn;
     event->cb = callback;
     event->opaque = opaque;
+    event->freecb = freecb;
 
     /* Make space on list */
     n = cbList->count;
index c26ec3b39acf20a1f102195972f46b54a3b55134..cfec1e16cbc89bc5116b99f914b7b55a53eb96da 100644 (file)
@@ -30,6 +30,8 @@ struct _virDomainEventCallback {
     virConnectPtr conn;
     virConnectDomainEventCallback cb;
     void *opaque;
+    virFreeCallback freecb;
+
 };
 typedef struct _virDomainEventCallback virDomainEventCallback;
 typedef virDomainEventCallback *virDomainEventCallbackPtr;
@@ -46,7 +48,8 @@ void virDomainEventCallbackListFree(virDomainEventCallbackListPtr list);
 int virDomainEventCallbackListAdd(virConnectPtr conn,
                                   virDomainEventCallbackListPtr cbList,
                                   virConnectDomainEventCallback callback,
-                                  void *opaque);
+                                  void *opaque,
+                                  virFreeCallback freecb);
 
 int virDomainEventCallbackListRemove(virConnectPtr conn,
                                      virDomainEventCallbackListPtr cbList,
index 98a2763d0f2a6f8ef1ba05aa7c31489102e24c99..8962affb88f8d5909b1cceb39c403b63de593612 100644 (file)
@@ -281,7 +281,8 @@ typedef int
     (*virDrvDomainEventRegister)
                     (virConnectPtr conn,
                      void *callback,
-                     void *opaque);
+                     void *opaque,
+                     virFreeCallback freecb);
 
 typedef int
     (*virDrvDomainEventDeregister)
index f257c0f056a1738a7d346d4ac1dcee23a28dadb3..a1edb693c6a01d23d0648585ff45f10c92ca29c4 100644 (file)
@@ -5372,7 +5372,8 @@ virStorageVolGetPath(virStorageVolPtr vol)
 int
 virConnectDomainEventRegister(virConnectPtr conn,
                               virConnectDomainEventCallback cb,
-                              void *opaque)
+                              void *opaque,
+                              virFreeCallback freecb)
 {
 
     if (!VIR_IS_CONNECT(conn)) {
@@ -5385,7 +5386,7 @@ virConnectDomainEventRegister(virConnectPtr conn,
     }
 
     if ((conn->driver) && (conn->driver->domainEventRegister))
-        return conn->driver->domainEventRegister (conn, cb, opaque);
+        return conn->driver->domainEventRegister (conn, cb, opaque, freecb);
     return -1;
 }
 
index f9e93f8037c4978dadec584f9d8a3b1a46f4a804..641690e6be80b644abed236c59f31825a6a164d1 100644 (file)
@@ -3384,12 +3384,13 @@ done:
 static int
 qemudDomainEventRegister (virConnectPtr conn,
                           void *callback,
-                          void *opaque)
+                          void *opaque,
+                          virFreeCallback freecb)
 {
     struct qemud_driver *driver = (struct qemud_driver *)conn->privateData;
 
     return virDomainEventCallbackListAdd(conn, driver->domainEventCallbacks,
-                                         callback, opaque);
+                                         callback, opaque, freecb);
 }
 
 static int
index 2ca79301cd6c6ab9cd76fbdf457c895a7bb580e5..63e7c4a426552aaab8fe24b57674aa784747ba92 100644 (file)
@@ -4474,13 +4474,14 @@ remoteAuthPolkit (virConnectPtr conn, struct private_data *priv, int in_open,
 /*----------------------------------------------------------------------*/
 
 static int remoteDomainEventRegister (virConnectPtr conn,
-                               void *callback ATTRIBUTE_UNUSED,
-                               void *opaque ATTRIBUTE_UNUSED)
+                                      void *callback ATTRIBUTE_UNUSED,
+                                      void *opaque ATTRIBUTE_UNUSED,
+                                      virFreeCallback freecb)
 {
     struct private_data *priv = conn->privateData;
 
     if (virDomainEventCallbackListAdd(conn, priv->callbackList,
-                                  callback, opaque) < 0) {
+                                      callback, opaque, freecb) < 0) {
          error (conn, VIR_ERR_RPC, _("adding cb to list"));
          return -1;
     }