mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-12 22:51:29 +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 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);
|
||||||
|
@ -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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
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;
|
||||||
|
@ -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:
|
|||||||
|
|
||||||
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);
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user