mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-02 01:45:17 +00:00
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:
parent
5c17a37142
commit
8a4820ab23
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user