Associate a dispatch function with the event objects

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>
This commit is contained in:
Daniel P. Berrange 2013-12-12 17:47:42 +00:00
parent 5c17a37142
commit 8a4820ab23
6 changed files with 42 additions and 76 deletions

View File

@ -61,6 +61,11 @@ static void virDomainEventTrayChangeDispose(void *obj);
static void virDomainEventBalloonChangeDispose(void *obj); static void virDomainEventBalloonChangeDispose(void *obj);
static void virDomainEventDeviceRemovedDispose(void *obj); static void virDomainEventDeviceRemovedDispose(void *obj);
static void
virDomainEventDispatchDefaultFunc(virConnectPtr conn,
virObjectEventPtr event,
virConnectObjectEventGenericCallback cb,
void *cbopaque);
struct _virDomainEvent { struct _virDomainEvent {
virObjectEvent parent; virObjectEvent parent;
@ -462,7 +467,9 @@ virDomainEventNew(virClassPtr klass,
return NULL; return NULL;
} }
if (!(event = virObjectEventNew(klass, eventID, if (!(event = virObjectEventNew(klass,
virDomainEventDispatchDefaultFunc,
eventID,
id, name, uuid))) id, name, uuid)))
return NULL; return NULL;
@ -1160,12 +1167,11 @@ virDomainEventDeviceRemovedNewFromDom(virDomainPtr dom,
} }
void static void
virDomainEventDispatchDefaultFunc(virConnectPtr conn, virDomainEventDispatchDefaultFunc(virConnectPtr conn,
virObjectEventPtr event, virObjectEventPtr event,
virConnectDomainEventGenericCallback cb, virConnectObjectEventGenericCallback cb,
void *cbopaque, void *cbopaque)
void *opaque ATTRIBUTE_UNUSED)
{ {
virDomainPtr dom = virGetDomain(conn, event->meta.name, event->meta.uuid); virDomainPtr dom = virGetDomain(conn, event->meta.name, event->meta.uuid);
int eventID = virObjectEventGetEventID(event); int eventID = virObjectEventGetEventID(event);

View File

@ -197,11 +197,4 @@ virDomainEventStateDeregister(virConnectPtr conn,
virConnectDomainEventCallback callback) virConnectDomainEventCallback callback)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3); ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
void
virDomainEventDispatchDefaultFunc(virConnectPtr conn,
virObjectEventPtr event,
virConnectDomainEventGenericCallback cb,
void *cbopaque,
void *opaque);
#endif #endif

View File

@ -87,12 +87,11 @@ virNetworkEventLifecycleDispose(void *obj)
} }
void static void
virNetworkEventDispatchDefaultFunc(virConnectPtr conn, virNetworkEventDispatchDefaultFunc(virConnectPtr conn,
virObjectEventPtr event, virObjectEventPtr event,
virConnectNetworkEventGenericCallback cb ATTRIBUTE_UNUSED, virConnectObjectEventGenericCallback cb,
void *cbopaque ATTRIBUTE_UNUSED, void *cbopaque)
void *opaque ATTRIBUTE_UNUSED)
{ {
virNetworkPtr net = virGetNetwork(conn, event->meta.name, event->meta.uuid); virNetworkPtr net = virGetNetwork(conn, event->meta.name, event->meta.uuid);
if (!net) if (!net)
@ -171,6 +170,7 @@ virNetworkEventLifecycleNew(const char *name,
return NULL; return NULL;
if (!(event = virObjectEventNew(virNetworkEventLifecycleClass, if (!(event = virObjectEventNew(virNetworkEventLifecycleClass,
virNetworkEventDispatchDefaultFunc,
eventId, eventId,
0, name, uuid))) 0, name, uuid)))
return NULL; return NULL;

View File

@ -43,10 +43,4 @@ virNetworkEventLifecycleNew(const char *name,
int type, int type,
int detail); int detail);
void
virNetworkEventDispatchDefaultFunc(virConnectPtr conn,
virObjectEventPtr event,
virConnectNetworkEventGenericCallback cb,
void *cbopaque,
void *opaque);
#endif #endif

View File

@ -469,6 +469,7 @@ error:
void * void *
virObjectEventNew(virClassPtr klass, virObjectEventNew(virClassPtr klass,
virObjectEventDispatchFunc dispatcher,
int eventID, int eventID,
int id, int id,
const char *name, const char *name,
@ -489,6 +490,7 @@ virObjectEventNew(virClassPtr klass,
if (!(event = virObjectNew(klass))) if (!(event = virObjectNew(klass)))
return NULL; return NULL;
event->dispatch = dispatcher;
event->eventID = eventID; event->eventID = eventID;
if (VIR_STRDUP(event->meta.name, name) < 0) { 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 static int
virObjectEventDispatchMatchCallback(virObjectEventPtr event, virObjectEventDispatchMatchCallback(virObjectEventPtr event,
virObjectEventCallbackPtr cb) virObjectEventCallbackPtr cb)
@ -566,10 +561,9 @@ virObjectEventDispatchMatchCallback(virObjectEventPtr event,
static void static void
virObjectEventDispatch(virObjectEventPtr event, virObjectEventStateDispatchCallbacks(virObjectEventStatePtr state,
virObjectEventCallbackListPtr callbacks, virObjectEventPtr event,
virObjectEventDispatchFunc dispatch, virObjectEventCallbackListPtr callbacks)
void *opaque)
{ {
size_t i; size_t i;
/* Cache this now, since we may be dropping the lock, /* Cache this now, since we may be dropping the lock,
@ -581,25 +575,26 @@ virObjectEventDispatch(virObjectEventPtr event,
if (!virObjectEventDispatchMatchCallback(event, callbacks->callbacks[i])) if (!virObjectEventDispatchMatchCallback(event, callbacks->callbacks[i]))
continue; continue;
(*dispatch)(callbacks->callbacks[i]->conn, /* Drop the lock whle dispatching, for sake of re-entrancy */
virObjectEventStateUnlock(state);
event->dispatch(callbacks->callbacks[i]->conn,
event, event,
callbacks->callbacks[i]->cb, callbacks->callbacks[i]->cb,
callbacks->callbacks[i]->opaque, callbacks->callbacks[i]->opaque);
opaque); virObjectEventStateLock(state);
} }
} }
static void static void
virObjectEventQueueDispatch(virObjectEventQueuePtr queue, virObjectEventStateQueueDispatch(virObjectEventStatePtr state,
virObjectEventCallbackListPtr callbacks, virObjectEventQueuePtr queue,
virObjectEventDispatchFunc dispatch, virObjectEventCallbackListPtr callbacks)
void *opaque)
{ {
size_t i; size_t i;
for (i = 0; i < queue->count; 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]); virObjectUnref(queue->events[i]);
} }
VIR_FREE(queue->events); 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 static void
virObjectEventStateFlush(virObjectEventStatePtr state) virObjectEventStateFlush(virObjectEventStatePtr state)
{ {
@ -672,10 +639,9 @@ virObjectEventStateFlush(virObjectEventStatePtr state)
state->queue->events = NULL; state->queue->events = NULL;
virEventUpdateTimeout(state->timer, -1); virEventUpdateTimeout(state->timer, -1);
virObjectEventQueueDispatch(&tempQueue, virObjectEventStateQueueDispatch(state,
state->callbacks, &tempQueue,
virObjectEventStateDispatchFunc, state->callbacks);
state);
/* Purge any deleted callbacks */ /* Purge any deleted callbacks */
virObjectEventCallbackListPurgeMarked(state->callbacks); virObjectEventCallbackListPurgeMarked(state->callbacks);

View File

@ -69,10 +69,17 @@ struct _virObjectEventCallback {
int deleted; int deleted;
}; };
typedef void
(*virObjectEventDispatchFunc)(virConnectPtr conn,
virObjectEventPtr event,
virConnectObjectEventGenericCallback cb,
void *cbopaque);
struct _virObjectEvent { struct _virObjectEvent {
virObject parent; virObject parent;
int eventID; int eventID;
virObjectMeta meta; virObjectMeta meta;
virObjectEventDispatchFunc dispatch;
}; };
virClassPtr virClassPtr
@ -108,10 +115,10 @@ virObjectEventTimer(int timer,
void * void *
virObjectEventNew(virClassPtr klass, virObjectEventNew(virClassPtr klass,
virObjectEventDispatchFunc dispatcher,
int eventID, int eventID,
int id, int id,
const char *name, const char *name,
const unsigned char *uuid); const unsigned char *uuid);
#endif #endif