提交 8a4820ab 编写于 作者: D Daniel P. Berrange

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: NDaniel P. Berrange <berrange@redhat.com>
上级 5c17a371
...@@ -61,6 +61,11 @@ static void virDomainEventTrayChangeDispose(void *obj); ...@@ -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, ...@@ -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, ...@@ -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);
......
...@@ -197,11 +197,4 @@ virDomainEventStateDeregister(virConnectPtr conn, ...@@ -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
...@@ -87,12 +87,11 @@ virNetworkEventLifecycleDispose(void *obj) ...@@ -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, ...@@ -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;
......
...@@ -43,10 +43,4 @@ virNetworkEventLifecycleNew(const char *name, ...@@ -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
...@@ -469,6 +469,7 @@ error: ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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 */
event, virObjectEventStateUnlock(state);
callbacks->callbacks[i]->cb, event->dispatch(callbacks->callbacks[i]->conn,
callbacks->callbacks[i]->opaque, event,
opaque); callbacks->callbacks[i]->cb,
callbacks->callbacks[i]->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, ...@@ -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) ...@@ -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);
......
...@@ -69,10 +69,17 @@ struct _virObjectEventCallback { ...@@ -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, ...@@ -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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册