[libvirt] [PATCH 5/7] Associate a dispatch function with the event objects

Daniel P. Berrange berrange at redhat.com
Thu Dec 12 18:04:05 UTC 2013


From: "Daniel P. Berrange" <berrange at redhat.com>

Instead of having the object event code have to know about each
type of event and their dispatch functions, associate a dispatch
function with the object instance. The dispatch code can thus be
significantly simplified.

Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
---
 src/conf/domain_event.c         | 16 ++++++---
 src/conf/domain_event.h         |  7 ----
 src/conf/network_event.c        |  8 ++---
 src/conf/network_event.h        |  6 ----
 src/conf/object_event.c         | 72 +++++++++++------------------------------
 src/conf/object_event_private.h |  9 +++++-
 6 files changed, 42 insertions(+), 76 deletions(-)

diff --git a/src/conf/domain_event.c b/src/conf/domain_event.c
index 64035f7..a9c499e 100644
--- a/src/conf/domain_event.c
+++ b/src/conf/domain_event.c
@@ -61,6 +61,11 @@ static void virDomainEventTrayChangeDispose(void *obj);
 static void virDomainEventBalloonChangeDispose(void *obj);
 static void virDomainEventDeviceRemovedDispose(void *obj);
 
+static void
+virDomainEventDispatchDefaultFunc(virConnectPtr conn,
+                                  virObjectEventPtr event,
+                                  virConnectObjectEventGenericCallback cb,
+                                  void *cbopaque);
 
 struct _virDomainEvent {
     virObjectEvent parent;
@@ -462,7 +467,9 @@ virDomainEventNew(virClassPtr klass,
         return NULL;
     }
 
-    if (!(event = virObjectEventNew(klass, eventID,
+    if (!(event = virObjectEventNew(klass,
+                                    virDomainEventDispatchDefaultFunc,
+                                    eventID,
                                     id, name, uuid)))
         return NULL;
 
@@ -1160,12 +1167,11 @@ virDomainEventDeviceRemovedNewFromDom(virDomainPtr dom,
 }
 
 
-void
+static void
 virDomainEventDispatchDefaultFunc(virConnectPtr conn,
                                   virObjectEventPtr event,
-                                  virConnectDomainEventGenericCallback cb,
-                                  void *cbopaque,
-                                  void *opaque ATTRIBUTE_UNUSED)
+                                  virConnectObjectEventGenericCallback cb,
+                                  void *cbopaque)
 {
     virDomainPtr dom = virGetDomain(conn, event->meta.name, event->meta.uuid);
     int eventID = virObjectEventGetEventID(event);
diff --git a/src/conf/domain_event.h b/src/conf/domain_event.h
index 30156ed..b2ea580 100644
--- a/src/conf/domain_event.h
+++ b/src/conf/domain_event.h
@@ -197,11 +197,4 @@ virDomainEventStateDeregister(virConnectPtr conn,
                               virConnectDomainEventCallback callback)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
 
-void
-virDomainEventDispatchDefaultFunc(virConnectPtr conn,
-                                  virObjectEventPtr event,
-                                  virConnectDomainEventGenericCallback cb,
-                                  void *cbopaque,
-                                  void *opaque);
-
 #endif
diff --git a/src/conf/network_event.c b/src/conf/network_event.c
index b1312b7..3173e68 100644
--- a/src/conf/network_event.c
+++ b/src/conf/network_event.c
@@ -87,12 +87,11 @@ virNetworkEventLifecycleDispose(void *obj)
 }
 
 
-void
+static void
 virNetworkEventDispatchDefaultFunc(virConnectPtr conn,
                                    virObjectEventPtr event,
-                                   virConnectNetworkEventGenericCallback cb ATTRIBUTE_UNUSED,
-                                   void *cbopaque ATTRIBUTE_UNUSED,
-                                   void *opaque ATTRIBUTE_UNUSED)
+                                   virConnectObjectEventGenericCallback cb,
+                                   void *cbopaque)
 {
     virNetworkPtr net = virGetNetwork(conn, event->meta.name, event->meta.uuid);
     if (!net)
@@ -171,6 +170,7 @@ virNetworkEventLifecycleNew(const char *name,
         return NULL;
 
     if (!(event = virObjectEventNew(virNetworkEventLifecycleClass,
+                                    virNetworkEventDispatchDefaultFunc,
                                     eventId,
                                     0, name, uuid)))
         return NULL;
diff --git a/src/conf/network_event.h b/src/conf/network_event.h
index 1eef771..a1afbc5 100644
--- a/src/conf/network_event.h
+++ b/src/conf/network_event.h
@@ -43,10 +43,4 @@ virNetworkEventLifecycleNew(const char *name,
                             int type,
                             int detail);
 
-void
-virNetworkEventDispatchDefaultFunc(virConnectPtr conn,
-                                   virObjectEventPtr event,
-                                   virConnectNetworkEventGenericCallback cb,
-                                   void *cbopaque,
-                                   void *opaque);
 #endif
diff --git a/src/conf/object_event.c b/src/conf/object_event.c
index ec00aaf..96c719c 100644
--- a/src/conf/object_event.c
+++ b/src/conf/object_event.c
@@ -466,6 +466,7 @@ error:
 
 void *
 virObjectEventNew(virClassPtr klass,
+                  virObjectEventDispatchFunc dispatcher,
                   int eventID,
                   int id,
                   const char *name,
@@ -486,6 +487,7 @@ virObjectEventNew(virClassPtr klass,
     if (!(event = virObjectNew(klass)))
         return NULL;
 
+    event->dispatch = dispatcher;
     event->eventID = eventID;
 
     if (VIR_STRDUP(event->meta.name, name) < 0) {
@@ -527,13 +529,6 @@ virObjectEventQueuePush(virObjectEventQueuePtr evtQueue,
 }
 
 
-typedef void (*virObjectEventDispatchFunc)(virConnectPtr conn,
-                                           virObjectEventPtr event,
-                                           virConnectObjectEventGenericCallback cb,
-                                           void *cbopaque,
-                                           void *opaque);
-
-
 static int
 virObjectEventDispatchMatchCallback(virObjectEventPtr event,
                                     virObjectEventCallbackPtr cb)
@@ -563,10 +558,9 @@ virObjectEventDispatchMatchCallback(virObjectEventPtr event,
 
 
 static void
-virObjectEventDispatch(virObjectEventPtr event,
-                       virObjectEventCallbackListPtr callbacks,
-                       virObjectEventDispatchFunc dispatch,
-                       void *opaque)
+virObjectEventStateDispatchCallbacks(virObjectEventStatePtr state,
+                                     virObjectEventPtr event,
+                                     virObjectEventCallbackListPtr callbacks)
 {
     size_t i;
     /* Cache this now, since we may be dropping the lock,
@@ -578,25 +572,26 @@ virObjectEventDispatch(virObjectEventPtr event,
         if (!virObjectEventDispatchMatchCallback(event, callbacks->callbacks[i]))
             continue;
 
-        (*dispatch)(callbacks->callbacks[i]->conn,
-                    event,
-                    callbacks->callbacks[i]->cb,
-                    callbacks->callbacks[i]->opaque,
-                    opaque);
+        /* Drop the lock whle dispatching, for sake of re-entrancy */
+        virObjectEventStateUnlock(state);
+        event->dispatch(callbacks->callbacks[i]->conn,
+                        event,
+                        callbacks->callbacks[i]->cb,
+                        callbacks->callbacks[i]->opaque);
+        virObjectEventStateLock(state);
     }
 }
 
 
 static void
-virObjectEventQueueDispatch(virObjectEventQueuePtr queue,
-                            virObjectEventCallbackListPtr callbacks,
-                            virObjectEventDispatchFunc dispatch,
-                            void *opaque)
+virObjectEventStateQueueDispatch(virObjectEventStatePtr state,
+                                 virObjectEventQueuePtr queue,
+                                 virObjectEventCallbackListPtr callbacks)
 {
     size_t i;
 
     for (i = 0; i < queue->count; i++) {
-        virObjectEventDispatch(queue->events[i], callbacks, dispatch, opaque);
+        virObjectEventStateDispatchCallbacks(state, queue->events[i], callbacks);
         virObjectUnref(queue->events[i]);
     }
     VIR_FREE(queue->events);
@@ -626,34 +621,6 @@ virObjectEventStateQueue(virObjectEventStatePtr state,
 
 
 static void
-virObjectEventStateDispatchFunc(virConnectPtr conn,
-                                virObjectEventPtr event,
-                                virConnectObjectEventGenericCallback cb,
-                                void *cbopaque,
-                                void *opaque)
-{
-    virObjectEventStatePtr state = opaque;
-    virEventNamespaceID namespace = (event->eventID & 0xFF00) >> 8;
-
-    /* Drop the lock whle dispatching, for sake of re-entrancy */
-    virObjectEventStateUnlock(state);
-    switch (namespace) {
-    case VIR_EVENT_NAMESPACE_DOMAIN:
-        virDomainEventDispatchDefaultFunc(conn, event,
-                VIR_DOMAIN_EVENT_CALLBACK(cb), cbopaque, NULL);
-        break;
-    case VIR_EVENT_NAMESPACE_NETWORK:
-        virNetworkEventDispatchDefaultFunc(conn, event,
-                VIR_NETWORK_EVENT_CALLBACK(cb), cbopaque, NULL);
-        break;
-    default:
-        VIR_ERROR(_("Unknown event namespace to dispatch"));
-    }
-    virObjectEventStateLock(state);
-}
-
-
-static void
 virObjectEventStateFlush(virObjectEventStatePtr state)
 {
     virObjectEventQueue tempQueue;
@@ -669,10 +636,9 @@ virObjectEventStateFlush(virObjectEventStatePtr state)
     state->queue->events = NULL;
     virEventUpdateTimeout(state->timer, -1);
 
-    virObjectEventQueueDispatch(&tempQueue,
-                                state->callbacks,
-                                virObjectEventStateDispatchFunc,
-                                state);
+    virObjectEventStateQueueDispatch(state,
+                                     &tempQueue,
+                                     state->callbacks);
 
     /* Purge any deleted callbacks */
     virObjectEventCallbackListPurgeMarked(state->callbacks);
diff --git a/src/conf/object_event_private.h b/src/conf/object_event_private.h
index f41f432..f18277a 100644
--- a/src/conf/object_event_private.h
+++ b/src/conf/object_event_private.h
@@ -69,10 +69,17 @@ struct _virObjectEventCallback {
     int deleted;
 };
 
+typedef void
+(*virObjectEventDispatchFunc)(virConnectPtr conn,
+                              virObjectEventPtr event,
+                              virConnectObjectEventGenericCallback cb,
+                              void *cbopaque);
+
 struct _virObjectEvent {
     virObject parent;
     int eventID;
     virObjectMeta meta;
+    virObjectEventDispatchFunc dispatch;
 };
 
 virClassPtr
@@ -108,10 +115,10 @@ virObjectEventTimer(int timer,
 
 void *
 virObjectEventNew(virClassPtr klass,
+                  virObjectEventDispatchFunc dispatcher,
                   int eventID,
                   int id,
                   const char *name,
                   const unsigned char *uuid);
 
-
 #endif
-- 
1.8.3.1




More information about the libvir-list mailing list