[libvirt] [PATCH 6/7] Remove the event namespace concept
Michal Privoznik
mprivozn at redhat.com
Fri Dec 13 10:22:06 UTC 2013
On 12.12.2013 19:04, Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
>
> The event namespace concept is mostly redundant information.
> With the re-written dispatcher, the namespace is only used
> for equality comparisons between event IDs. This can be solved
> by just comparing virClassPtr instances instead.
>
> Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> ---
> src/conf/domain_event.c | 11 +++++++++--
> src/conf/network_event.c | 15 +++++++++------
> src/conf/object_event.c | 17 ++++++++++++-----
> src/conf/object_event.h | 11 +++--------
> src/conf/object_event_private.h | 2 ++
> 5 files changed, 35 insertions(+), 21 deletions(-)
>
> diff --git a/src/conf/domain_event.c b/src/conf/domain_event.c
> index a9c499e..e5f5796 100644
> --- a/src/conf/domain_event.c
> +++ b/src/conf/domain_event.c
> @@ -442,6 +442,7 @@ virDomainEventCallbackListAdd(virConnectPtr conn,
> virFreeCallback freecb)
> {
> return virObjectEventCallbackListAddID(conn, cbList, NULL, NULL, 0,
> + virDomainEventClass,
> VIR_DOMAIN_EVENT_ID_LIFECYCLE,
> VIR_OBJECT_EVENT_CALLBACK(callback),
> opaque, freecb, NULL);
> @@ -1372,6 +1373,9 @@ virDomainEventStateRegister(virConnectPtr conn,
> {
> int ret = -1;
>
> + if (virDomainEventsInitialize() < 0)
> + return -1;
> +
> virObjectEventStateLock(state);
>
> if ((state->callbacks->count == 0) &&
> @@ -1426,14 +1430,17 @@ virDomainEventStateRegisterID(virConnectPtr conn,
> virFreeCallback freecb,
> int *callbackID)
> {
> + if (virDomainEventsInitialize() < 0)
> + return -1;
> +
> if (dom)
> return virObjectEventStateRegisterID(conn, state, dom->uuid, dom->name,
> - dom->id, eventID,
> + dom->id, virDomainEventClass, eventID,
> VIR_OBJECT_EVENT_CALLBACK(cb),
> opaque, freecb, callbackID);
> else
> return virObjectEventStateRegisterID(conn, state, NULL, NULL, 0,
> - eventID,
> + virDomainEventClass, eventID,
> VIR_OBJECT_EVENT_CALLBACK(cb),
> opaque, freecb, callbackID);
> }
> diff --git a/src/conf/network_event.c b/src/conf/network_event.c
> index 3173e68..3819702 100644
> --- a/src/conf/network_event.c
> +++ b/src/conf/network_event.c
> @@ -97,7 +97,7 @@ virNetworkEventDispatchDefaultFunc(virConnectPtr conn,
> if (!net)
> return;
>
> - switch ((virNetworkEventID) (event->eventID &0xFF)) {
> + switch ((virNetworkEventID)event->eventID) {
> case VIR_NETWORK_EVENT_ID_LIFECYCLE:
> {
> virNetworkEventLifecyclePtr networkLifecycleEvent;
> @@ -146,14 +146,18 @@ virNetworkEventStateRegisterID(virConnectPtr conn,
> virFreeCallback freecb,
> int *callbackID)
> {
> - int nsEventID = (VIR_EVENT_NAMESPACE_NETWORK << 8) + eventID;
> + if (virNetworkEventsInitialize() < 0)
> + return -1;
> +
> if (net)
> return virObjectEventStateRegisterID(conn, state,
> - net->uuid, net->name, 0, nsEventID,
> + net->uuid, net->name, 0,
> + virNetworkEventClass, eventID,
> cb, opaque, freecb, callbackID);
> else
> return virObjectEventStateRegisterID(conn, state,
> - NULL, NULL, 0, nsEventID,
> + NULL, NULL, 0,
> + virNetworkEventClass, eventID,
> cb, opaque, freecb, callbackID);
> }
>
> @@ -164,14 +168,13 @@ virNetworkEventLifecycleNew(const char *name,
> int detail)
> {
> virNetworkEventLifecyclePtr event;
> - int eventId = (VIR_EVENT_NAMESPACE_NETWORK << 8) + VIR_NETWORK_EVENT_ID_LIFECYCLE;
>
> if (virNetworkEventsInitialize() < 0)
> return NULL;
>
> if (!(event = virObjectEventNew(virNetworkEventLifecycleClass,
> virNetworkEventDispatchDefaultFunc,
> - eventId,
> + VIR_NETWORK_EVENT_ID_LIFECYCLE,
> 0, name, uuid)))
> return NULL;
>
> diff --git a/src/conf/object_event.c b/src/conf/object_event.c
> index 96c719c..aeee6d5 100644
> --- a/src/conf/object_event.c
> +++ b/src/conf/object_event.c
> @@ -227,6 +227,7 @@ virObjectEventCallbackListPurgeMarked(virObjectEventCallbackListPtr cbList)
> * @uuid: the uuid of the object to filter on
> * @name: the name of the object to filter on
> * @id: the ID of the object to filter on
> + * @klass: the base event class
> * @eventID: the event ID
> * @callback: the callback to add
> * @opaque: opaque data tio pass to callback
> @@ -240,6 +241,7 @@ virObjectEventCallbackListAddID(virConnectPtr conn,
> unsigned char uuid[VIR_UUID_BUFLEN],
> const char *name,
> int id,
> + virClassPtr klass,
> int eventID,
> virConnectObjectEventGenericCallback callback,
> void *opaque,
> @@ -258,6 +260,7 @@ virObjectEventCallbackListAddID(virConnectPtr conn,
> /* check if we already have this callback on our list */
> for (i = 0; i < cbList->count; i++) {
> if (cbList->callbacks[i]->cb == VIR_OBJECT_EVENT_CALLBACK(callback) &&
> + cbList->callbacks[i]->klass == klass &&
> cbList->callbacks[i]->eventID == eventID &&
> cbList->callbacks[i]->conn == conn &&
> ((uuid && cbList->callbacks[i]->meta &&
> @@ -274,6 +277,7 @@ virObjectEventCallbackListAddID(virConnectPtr conn,
> goto error;
> event->conn = conn;
> event->cb = callback;
> + event->klass = klass;
> event->eventID = eventID;
> event->opaque = opaque;
> event->freecb = freecb;
> @@ -299,7 +303,8 @@ virObjectEventCallbackListAddID(virConnectPtr conn,
> event->callbackID = cbList->nextID++;
>
> for (i = 0; i < cbList->count; i++) {
> - if (cbList->callbacks[i]->eventID == eventID &&
> + if (cbList->callbacks[i]->klass == klass &&
> + cbList->callbacks[i]->eventID == eventID &&
> cbList->callbacks[i]->conn == conn &&
> !cbList->callbacks[i]->deleted)
> ret++;
> @@ -537,6 +542,8 @@ virObjectEventDispatchMatchCallback(virObjectEventPtr event,
> return 0;
> if (cb->deleted)
> return 0;
> + if (!virObjectIsClass(event, cb->klass))
> + return 0;
Yep. since cb->klass must be non-null at this point this won't crash
anymore.
ACK
Michal
More information about the libvir-list
mailing list