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 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);

View 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

View 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;

View 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

View 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);

View 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