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

Cedric Bosdonnat cbosdonnat at suse.com
Fri Dec 13 10:20:13 UTC 2013


On Thu, 2013-12-12 at 18:04 +0000, Daniel P. Berrange wrote:
> 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

ACK. A clever way to get rid of the initialization problem.

--
Cedric




More information about the libvir-list mailing list