Remove the event namespace concept

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@redhat.com>
This commit is contained in:
Daniel P. Berrange 2013-12-11 14:10:34 +00:00
parent 8a4820ab23
commit dbcc38da15
5 changed files with 36 additions and 22 deletions

View File

@ -442,6 +442,7 @@ virDomainEventCallbackListAdd(virConnectPtr conn,
virFreeCallback freecb) virFreeCallback freecb)
{ {
return virObjectEventCallbackListAddID(conn, cbList, NULL, NULL, 0, return virObjectEventCallbackListAddID(conn, cbList, NULL, NULL, 0,
virDomainEventClass,
VIR_DOMAIN_EVENT_ID_LIFECYCLE, VIR_DOMAIN_EVENT_ID_LIFECYCLE,
VIR_OBJECT_EVENT_CALLBACK(callback), VIR_OBJECT_EVENT_CALLBACK(callback),
opaque, freecb, NULL); opaque, freecb, NULL);
@ -1372,6 +1373,9 @@ virDomainEventStateRegister(virConnectPtr conn,
{ {
int ret = -1; int ret = -1;
if (virDomainEventsInitialize() < 0)
return -1;
virObjectEventStateLock(state); virObjectEventStateLock(state);
if ((state->callbacks->count == 0) && if ((state->callbacks->count == 0) &&
@ -1426,14 +1430,17 @@ virDomainEventStateRegisterID(virConnectPtr conn,
virFreeCallback freecb, virFreeCallback freecb,
int *callbackID) int *callbackID)
{ {
if (virDomainEventsInitialize() < 0)
return -1;
if (dom) if (dom)
return virObjectEventStateRegisterID(conn, state, dom->uuid, dom->name, return virObjectEventStateRegisterID(conn, state, dom->uuid, dom->name,
dom->id, eventID, dom->id, virDomainEventClass, eventID,
VIR_OBJECT_EVENT_CALLBACK(cb), VIR_OBJECT_EVENT_CALLBACK(cb),
opaque, freecb, callbackID); opaque, freecb, callbackID);
else else
return virObjectEventStateRegisterID(conn, state, NULL, NULL, 0, return virObjectEventStateRegisterID(conn, state, NULL, NULL, 0,
eventID, virDomainEventClass, eventID,
VIR_OBJECT_EVENT_CALLBACK(cb), VIR_OBJECT_EVENT_CALLBACK(cb),
opaque, freecb, callbackID); opaque, freecb, callbackID);
} }

View File

@ -97,7 +97,7 @@ virNetworkEventDispatchDefaultFunc(virConnectPtr conn,
if (!net) if (!net)
return; return;
switch ((virNetworkEventID) (event->eventID &0xFF)) { switch ((virNetworkEventID)event->eventID) {
case VIR_NETWORK_EVENT_ID_LIFECYCLE: case VIR_NETWORK_EVENT_ID_LIFECYCLE:
{ {
virNetworkEventLifecyclePtr networkLifecycleEvent; virNetworkEventLifecyclePtr networkLifecycleEvent;
@ -146,14 +146,18 @@ virNetworkEventStateRegisterID(virConnectPtr conn,
virFreeCallback freecb, virFreeCallback freecb,
int *callbackID) int *callbackID)
{ {
int nsEventID = (VIR_EVENT_NAMESPACE_NETWORK << 8) + eventID; if (virNetworkEventsInitialize() < 0)
return -1;
if (net) if (net)
return virObjectEventStateRegisterID(conn, state, return virObjectEventStateRegisterID(conn, state,
net->uuid, net->name, 0, nsEventID, net->uuid, net->name, 0,
virNetworkEventClass, eventID,
cb, opaque, freecb, callbackID); cb, opaque, freecb, callbackID);
else else
return virObjectEventStateRegisterID(conn, state, return virObjectEventStateRegisterID(conn, state,
NULL, NULL, 0, nsEventID, NULL, NULL, 0,
virNetworkEventClass, eventID,
cb, opaque, freecb, callbackID); cb, opaque, freecb, callbackID);
} }
@ -164,14 +168,13 @@ virNetworkEventLifecycleNew(const char *name,
int detail) int detail)
{ {
virNetworkEventLifecyclePtr event; virNetworkEventLifecyclePtr event;
int eventId = (VIR_EVENT_NAMESPACE_NETWORK << 8) + VIR_NETWORK_EVENT_ID_LIFECYCLE;
if (virNetworkEventsInitialize() < 0) if (virNetworkEventsInitialize() < 0)
return NULL; return NULL;
if (!(event = virObjectEventNew(virNetworkEventLifecycleClass, if (!(event = virObjectEventNew(virNetworkEventLifecycleClass,
virNetworkEventDispatchDefaultFunc, virNetworkEventDispatchDefaultFunc,
eventId, VIR_NETWORK_EVENT_ID_LIFECYCLE,
0, name, uuid))) 0, name, uuid)))
return NULL; return NULL;

View File

@ -230,6 +230,7 @@ virObjectEventCallbackListPurgeMarked(virObjectEventCallbackListPtr cbList)
* @uuid: the uuid of the object to filter on * @uuid: the uuid of the object to filter on
* @name: the name of the object to filter on * @name: the name of the object to filter on
* @id: the ID of the object to filter on * @id: the ID of the object to filter on
* @klass: the base event class
* @eventID: the event ID * @eventID: the event ID
* @callback: the callback to add * @callback: the callback to add
* @opaque: opaque data tio pass to callback * @opaque: opaque data tio pass to callback
@ -243,6 +244,7 @@ virObjectEventCallbackListAddID(virConnectPtr conn,
unsigned char uuid[VIR_UUID_BUFLEN], unsigned char uuid[VIR_UUID_BUFLEN],
const char *name, const char *name,
int id, int id,
virClassPtr klass,
int eventID, int eventID,
virConnectObjectEventGenericCallback callback, virConnectObjectEventGenericCallback callback,
void *opaque, void *opaque,
@ -261,6 +263,7 @@ virObjectEventCallbackListAddID(virConnectPtr conn,
/* check if we already have this callback on our list */ /* check if we already have this callback on our list */
for (i = 0; i < cbList->count; i++) { for (i = 0; i < cbList->count; i++) {
if (cbList->callbacks[i]->cb == VIR_OBJECT_EVENT_CALLBACK(callback) && if (cbList->callbacks[i]->cb == VIR_OBJECT_EVENT_CALLBACK(callback) &&
cbList->callbacks[i]->klass == klass &&
cbList->callbacks[i]->eventID == eventID && cbList->callbacks[i]->eventID == eventID &&
cbList->callbacks[i]->conn == conn && cbList->callbacks[i]->conn == conn &&
((uuid && cbList->callbacks[i]->meta && ((uuid && cbList->callbacks[i]->meta &&
@ -277,6 +280,7 @@ virObjectEventCallbackListAddID(virConnectPtr conn,
goto error; goto error;
event->conn = conn; event->conn = conn;
event->cb = callback; event->cb = callback;
event->klass = klass;
event->eventID = eventID; event->eventID = eventID;
event->opaque = opaque; event->opaque = opaque;
event->freecb = freecb; event->freecb = freecb;
@ -302,7 +306,8 @@ virObjectEventCallbackListAddID(virConnectPtr conn,
event->callbackID = cbList->nextID++; event->callbackID = cbList->nextID++;
for (i = 0; i < cbList->count; i++) { 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]->conn == conn &&
!cbList->callbacks[i]->deleted) !cbList->callbacks[i]->deleted)
ret++; ret++;
@ -540,6 +545,8 @@ virObjectEventDispatchMatchCallback(virObjectEventPtr event,
return 0; return 0;
if (cb->deleted) if (cb->deleted)
return 0; return 0;
if (!virObjectIsClass(event, cb->klass))
return 0;
if (cb->eventID != virObjectEventGetEventID(event)) if (cb->eventID != virObjectEventGetEventID(event))
return 0; return 0;
@ -655,6 +662,7 @@ virObjectEventStateFlush(virObjectEventStatePtr state)
* virObjectEventStateRegisterID: * virObjectEventStateRegisterID:
* @conn: connection to associate with callback * @conn: connection to associate with callback
* @state: domain event state * @state: domain event state
* @klass: the base event class
* @eventID: ID of the event type to register for * @eventID: ID of the event type to register for
* @cb: function to remove from event * @cb: function to remove from event
* @opaque: data blob to pass to callback * @opaque: data blob to pass to callback
@ -672,6 +680,7 @@ virObjectEventStateRegisterID(virConnectPtr conn,
unsigned char *uuid, unsigned char *uuid,
const char *name, const char *name,
int id, int id,
virClassPtr klass,
int eventID, int eventID,
virConnectObjectEventGenericCallback cb, virConnectObjectEventGenericCallback cb,
void *opaque, void *opaque,
@ -694,7 +703,8 @@ virObjectEventStateRegisterID(virConnectPtr conn,
} }
ret = virObjectEventCallbackListAddID(conn, state->callbacks, ret = virObjectEventCallbackListAddID(conn, state->callbacks,
uuid, name, id, eventID, cb, opaque, freecb, uuid, name, id, klass, eventID,
cb, opaque, freecb,
callbackID); callbackID);
if (ret == -1 && if (ret == -1 &&
@ -769,9 +779,6 @@ virObjectEventStateEventID(virConnectPtr conn,
virObjectEventStateLock(state); virObjectEventStateLock(state);
ret = virObjectEventCallbackListEventID(conn, ret = virObjectEventCallbackListEventID(conn,
state->callbacks, callbackID); state->callbacks, callbackID);
/* Callers don't need to know we are namespacing the event Ids */
if (ret >= 0)
ret = (0xFF & ret);
virObjectEventStateUnlock(state); virObjectEventStateUnlock(state);
return ret; return ret;
} }

View File

@ -24,17 +24,11 @@
#include "internal.h" #include "internal.h"
#include "virobject.h"
#ifndef __OBJECT_EVENT_H__ #ifndef __OBJECT_EVENT_H__
# define __OBJECT_EVENT_H__ # define __OBJECT_EVENT_H__
/** Event IDs are computed in the following way:
virEventNamespaceID << 8 + vir*EventId
*/
typedef enum {
VIR_EVENT_NAMESPACE_DOMAIN = 0, /* 0 to keep value of virDomainEventId unchanged */
VIR_EVENT_NAMESPACE_NETWORK = 1,
} virEventNamespaceID;
typedef struct _virObjectEventCallback virObjectEventCallback; typedef struct _virObjectEventCallback virObjectEventCallback;
typedef virObjectEventCallback *virObjectEventCallbackPtr; typedef virObjectEventCallback *virObjectEventCallbackPtr;
@ -78,12 +72,13 @@ virObjectEventStateRegisterID(virConnectPtr conn,
unsigned char *uuid, unsigned char *uuid,
const char *name, const char *name,
int id, int id,
virClassPtr klass,
int eventID, int eventID,
virConnectObjectEventGenericCallback cb, virConnectObjectEventGenericCallback cb,
void *opaque, void *opaque,
virFreeCallback freecb, virFreeCallback freecb,
int *callbackID) int *callbackID)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(7); ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(8);
int int
virObjectEventStateDeregisterID(virConnectPtr conn, virObjectEventStateDeregisterID(virConnectPtr conn,
virObjectEventStatePtr state, virObjectEventStatePtr state,

View File

@ -60,6 +60,7 @@ struct _virObjectEventState {
struct _virObjectEventCallback { struct _virObjectEventCallback {
int callbackID; int callbackID;
virClassPtr klass;
int eventID; int eventID;
virConnectPtr conn; virConnectPtr conn;
virObjectMetaPtr meta; virObjectMetaPtr meta;
@ -94,6 +95,7 @@ virObjectEventCallbackListAddID(virConnectPtr conn,
unsigned char *uuid, unsigned char *uuid,
const char *name, const char *name,
int id, int id,
virClassPtr klass,
int eventID, int eventID,
virConnectObjectEventGenericCallback callback, virConnectObjectEventGenericCallback callback,
void *opaque, void *opaque,