typedef struct _virObjectEventQueue virObjectEventQueue;
typedef virObjectEventQueue *virObjectEventQueuePtr;
-struct _virDomainEventCallbackList {
+struct _virObjectEventCallbackList {
unsigned int nextID;
unsigned int count;
virObjectEventCallbackPtr *callbacks;
};
+typedef struct _virObjectEventCallbackList virObjectEventCallbackList;
+typedef virObjectEventCallbackList *virObjectEventCallbackListPtr;
struct _virObjectEventQueue {
unsigned int count;
struct _virObjectEventState {
/* The list of domain event callbacks */
- virDomainEventCallbackListPtr callbacks;
+ virObjectEventCallbackListPtr callbacks;
/* The queue of object events */
virObjectEventQueuePtr queue;
/* Timer for flushing events queue */
};
/**
- * virDomainEventCallbackListFree:
+ * virObjectEventCallbackListFree:
* @list: event callback list head
*
* Free the memory in the domain event callback list
*/
static void
-virDomainEventCallbackListFree(virDomainEventCallbackListPtr list)
+virObjectEventCallbackListFree(virObjectEventCallbackListPtr list)
{
size_t i;
if (!list)
* @cbList: the list
* @callback: the callback to remove
*
- * Internal function to remove a callback from a virDomainEventCallbackListPtr
+ * Internal function to remove a callback from a virObjectEventCallbackListPtr
*/
static int
virDomainEventCallbackListRemove(virConnectPtr conn,
- virDomainEventCallbackListPtr cbList,
+ virObjectEventCallbackListPtr cbList,
virConnectDomainEventCallback callback)
{
int ret = 0;
/**
- * virDomainEventCallbackListRemoveID:
+ * virObjectEventCallbackListRemoveID:
* @conn: pointer to the connection
* @cbList: the list
* @callback: the callback to remove
*
- * Internal function to remove a callback from a virDomainEventCallbackListPtr
+ * Internal function to remove a callback from a virObjectEventCallbackListPtr
*/
static int
-virDomainEventCallbackListRemoveID(virConnectPtr conn,
- virDomainEventCallbackListPtr cbList,
+virObjectEventCallbackListRemoveID(virConnectPtr conn,
+ virObjectEventCallbackListPtr cbList,
int callbackID)
{
int ret = 0;
static int
virDomainEventCallbackListMarkDelete(virConnectPtr conn,
- virDomainEventCallbackListPtr cbList,
+ virObjectEventCallbackListPtr cbList,
virConnectDomainEventCallback callback)
{
int ret = 0;
static int
-virDomainEventCallbackListMarkDeleteID(virConnectPtr conn,
- virDomainEventCallbackListPtr cbList,
+virObjectEventCallbackListMarkDeleteID(virConnectPtr conn,
+ virObjectEventCallbackListPtr cbList,
int callbackID)
{
int ret = 0;
static int
-virDomainEventCallbackListPurgeMarked(virDomainEventCallbackListPtr cbList)
+virObjectEventCallbackListPurgeMarked(virObjectEventCallbackListPtr cbList)
{
int old_count = cbList->count;
int n;
/**
- * virDomainEventCallbackListAddID:
+ * virObjectEventCallbackListAddID:
* @conn: pointer to the connection
* @cbList: the list
+ * @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
* @eventID: the event ID
* @callback: the callback to add
* @opaque: opaque data tio pass to callback
* @callbackID: filled with callback ID
*
- * Internal function to add a callback from a virDomainEventCallbackListPtr
+ * Internal function to add a callback from a virObjectEventCallbackListPtr
*/
static int
-virDomainEventCallbackListAddID(virConnectPtr conn,
- virDomainEventCallbackListPtr cbList,
- virDomainPtr dom,
+virObjectEventCallbackListAddID(virConnectPtr conn,
+ virObjectEventCallbackListPtr cbList,
+ unsigned char uuid[VIR_UUID_BUFLEN],
+ const char *name,
+ int id,
int eventID,
virConnectDomainEventGenericCallback callback,
void *opaque,
if (cbList->callbacks[i]->cb == VIR_DOMAIN_EVENT_CALLBACK(callback) &&
cbList->callbacks[i]->eventID == eventID &&
cbList->callbacks[i]->conn == conn &&
- ((dom && cbList->callbacks[i]->meta &&
+ ((uuid && cbList->callbacks[i]->meta &&
memcmp(cbList->callbacks[i]->meta->uuid,
- dom->uuid, VIR_UUID_BUFLEN) == 0) ||
- (!dom && !cbList->callbacks[i]->meta))) {
+ uuid, VIR_UUID_BUFLEN) == 0) ||
+ (!uuid && !cbList->callbacks[i]->meta))) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("event callback already tracked"));
return -1;
event->opaque = opaque;
event->freecb = freecb;
- if (dom) {
+ if (name && uuid && id > 0) {
if (VIR_ALLOC(event->meta) < 0)
goto error;
- if (VIR_STRDUP(event->meta->name, dom->name) < 0)
+ if (VIR_STRDUP(event->meta->name, name) < 0)
goto error;
- memcpy(event->meta->uuid, dom->uuid, VIR_UUID_BUFLEN);
- event->meta->id = dom->id;
+ memcpy(event->meta->uuid, uuid, VIR_UUID_BUFLEN);
+ event->meta->id = id;
}
/* Make space on list */
* @callback: the callback to add
* @opaque: opaque data tio pass to callback
*
- * Internal function to add a callback from a virDomainEventCallbackListPtr
+ * Internal function to add a callback from a virObjectEventCallbackListPtr
*/
static int
virDomainEventCallbackListAdd(virConnectPtr conn,
- virDomainEventCallbackListPtr cbList,
+ virObjectEventCallbackListPtr cbList,
virConnectDomainEventCallback callback,
void *opaque,
virFreeCallback freecb)
{
- return virDomainEventCallbackListAddID(conn, cbList, NULL,
+ return virObjectEventCallbackListAddID(conn, cbList, NULL, NULL, 0,
VIR_DOMAIN_EVENT_ID_LIFECYCLE,
VIR_DOMAIN_EVENT_CALLBACK(callback),
opaque, freecb, NULL);
static int
-virDomainEventCallbackListEventID(virConnectPtr conn,
- virDomainEventCallbackListPtr cbList,
+virObjectEventCallbackListEventID(virConnectPtr conn,
+ virObjectEventCallbackListPtr cbList,
int callbackID)
{
size_t i;
if (!state)
return;
- virDomainEventCallbackListFree(state->callbacks);
+ virObjectEventCallbackListFree(state->callbacks);
virObjectEventQueueFree(state->queue);
if (state->timer != -1)
static void
virDomainEventDispatch(virDomainEventPtr event,
- virDomainEventCallbackListPtr callbacks,
+ virObjectEventCallbackListPtr callbacks,
virDomainEventDispatchFunc dispatch,
void *opaque)
{
static void
virObjectEventQueueDispatch(virObjectEventQueuePtr queue,
- virDomainEventCallbackListPtr callbacks,
+ virObjectEventCallbackListPtr callbacks,
virDomainEventDispatchFunc dispatch,
void *opaque)
{
state);
/* Purge any deleted callbacks */
- virDomainEventCallbackListPurgeMarked(state->callbacks);
+ virObjectEventCallbackListPurgeMarked(state->callbacks);
state->isDispatching = false;
virObjectEventStateUnlock(state);
goto cleanup;
}
- ret = virDomainEventCallbackListAddID(conn, state->callbacks,
- dom, eventID, cb, opaque, freecb,
- callbackID);
+ if (dom == NULL)
+ ret = virObjectEventCallbackListAddID(conn, state->callbacks, NULL,
+ NULL, 0, eventID, cb,
+ opaque, freecb, callbackID);
+ else
+ ret = virObjectEventCallbackListAddID(conn, state->callbacks, dom->uuid,
+ dom->name, dom->id, eventID, cb,
+ opaque, freecb, callbackID);
if (ret == -1 &&
state->callbacks->count == 0 &&
virObjectEventStateLock(state);
if (state->isDispatching)
- ret = virDomainEventCallbackListMarkDeleteID(conn,
+ ret = virObjectEventCallbackListMarkDeleteID(conn,
state->callbacks, callbackID);
else
- ret = virDomainEventCallbackListRemoveID(conn,
+ ret = virObjectEventCallbackListRemoveID(conn,
state->callbacks, callbackID);
if (state->callbacks->count == 0 &&
int ret;
virObjectEventStateLock(state);
- ret = virDomainEventCallbackListEventID(conn,
+ ret = virObjectEventCallbackListEventID(conn,
state->callbacks, callbackID);
virObjectEventStateUnlock(state);
return ret;