]> xenbits.xensource.com Git - people/dariof/libvirt.git/commitdiff
Associate a dispatch function with the event objects
authorDaniel P. Berrange <berrange@redhat.com>
Thu, 12 Dec 2013 17:47:42 +0000 (17:47 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Fri, 13 Dec 2013 16:07:54 +0000 (16:07 +0000)
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@redhat.com>
src/conf/domain_event.c
src/conf/domain_event.h
src/conf/network_event.c
src/conf/network_event.h
src/conf/object_event.c
src/conf/object_event_private.h

index 64035f7bf2eaa1cf9f06a5f6a55821b9f0edf6e8..a9c499e6ae8011804385c3959922d4baff5b83c0 100644 (file)
@@ -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);
index 30156edda9b04983b6228a9c27f123f70096678d..b2ea580e677dc01acdb4fcc68ecd65d59f7e0e4d 100644 (file)
@@ -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
index b1312b78f1d4ca4a5175a8d50f5615e45e336a9d..3173e68384f823785992f14867c152671599e459 100644 (file)
@@ -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;
index 1eef771be45ac89ebc896d0cf7b796b7f4b3b43c..a1afbc5e0d1220dc770e3b39208b4ba96f10052d 100644 (file)
@@ -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
index 399927b49f83f692e897a38dd746cf3eaf5a3ccc..1d184842800c658e41087a8222c6d1b48eb87313 100644 (file)
@@ -469,6 +469,7 @@ error:
 
 void *
 virObjectEventNew(virClassPtr klass,
+                  virObjectEventDispatchFunc dispatcher,
                   int eventID,
                   int id,
                   const char *name,
@@ -489,6 +490,7 @@ virObjectEventNew(virClassPtr klass,
     if (!(event = virObjectNew(klass)))
         return NULL;
 
+    event->dispatch = dispatcher;
     event->eventID = eventID;
 
     if (VIR_STRDUP(event->meta.name, name) < 0) {
@@ -530,13 +532,6 @@ virObjectEventQueuePush(virObjectEventQueuePtr evtQueue,
 }
 
 
-typedef void (*virObjectEventDispatchFunc)(virConnectPtr conn,
-                                           virObjectEventPtr event,
-                                           virConnectObjectEventGenericCallback cb,
-                                           void *cbopaque,
-                                           void *opaque);
-
-
 static int
 virObjectEventDispatchMatchCallback(virObjectEventPtr event,
                                     virObjectEventCallbackPtr cb)
@@ -566,10 +561,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,
@@ -581,25 +575,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);
@@ -628,34 +623,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)
 {
@@ -672,10 +639,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);
index f41f4328be6e904afc81f0e0808d1d0d92d52a55..f18277a8d8ae7b12899b22ec81f16fbbdd7cd9ca 100644 (file)
@@ -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