diff --git a/src/conf/domain_event.c b/src/conf/domain_event.c index 64035f7bf2..a9c499e6ae 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 30156edda9..b2ea580e67 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 b1312b78f1..3173e68384 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 1eef771be4..a1afbc5e0d 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 399927b49f..1d18484280 100644 --- a/src/conf/object_event.c +++ b/src/conf/object_event.c @@ -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); diff --git a/src/conf/object_event_private.h b/src/conf/object_event_private.h index f41f4328be..f18277a8d8 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