#define VIR_FROM_THIS VIR_FROM_NONE
+#define VIR_OBJECT_EVENT_CALLBACK(cb) ((virConnectObjectEventGenericCallback)(cb))
+
struct _virObjectMeta {
int id;
char *name;
int eventID;
virConnectPtr conn;
virObjectMetaPtr meta;
- virConnectDomainEventGenericCallback cb;
+ virConnectObjectEventGenericCallback cb;
void *opaque;
virFreeCallback freecb;
int deleted;
int ret = 0;
size_t i;
for (i = 0; i < cbList->count; i++) {
- if (cbList->callbacks[i]->cb == VIR_DOMAIN_EVENT_CALLBACK(callback) &&
+ if (cbList->callbacks[i]->cb == VIR_OBJECT_EVENT_CALLBACK(callback) &&
cbList->callbacks[i]->eventID == VIR_DOMAIN_EVENT_ID_LIFECYCLE &&
cbList->callbacks[i]->conn == conn) {
virFreeCallback freecb = cbList->callbacks[i]->freecb;
int ret = 0;
size_t i;
for (i = 0; i < cbList->count; i++) {
- if (cbList->callbacks[i]->cb == VIR_DOMAIN_EVENT_CALLBACK(callback) &&
+ if (cbList->callbacks[i]->cb == VIR_OBJECT_EVENT_CALLBACK(callback) &&
cbList->callbacks[i]->eventID == VIR_DOMAIN_EVENT_ID_LIFECYCLE &&
cbList->callbacks[i]->conn == conn) {
cbList->callbacks[i]->deleted = 1;
const char *name,
int id,
int eventID,
- virConnectDomainEventGenericCallback callback,
+ virConnectObjectEventGenericCallback callback,
void *opaque,
virFreeCallback freecb,
int *callbackID)
/* check if we already have this callback on our list */
for (i = 0; i < cbList->count; i++) {
- if (cbList->callbacks[i]->cb == VIR_DOMAIN_EVENT_CALLBACK(callback) &&
+ if (cbList->callbacks[i]->cb == VIR_OBJECT_EVENT_CALLBACK(callback) &&
cbList->callbacks[i]->eventID == eventID &&
cbList->callbacks[i]->conn == conn &&
((uuid && cbList->callbacks[i]->meta &&
{
return virObjectEventCallbackListAddID(conn, cbList, NULL, NULL, 0,
VIR_DOMAIN_EVENT_ID_LIFECYCLE,
- VIR_DOMAIN_EVENT_CALLBACK(callback),
+ VIR_OBJECT_EVENT_CALLBACK(callback),
opaque, freecb, NULL);
}
}
-typedef void (*virDomainEventDispatchFunc)(virConnectPtr conn,
+typedef void (*virObjectEventDispatchFunc)(virConnectPtr conn,
virDomainEventPtr event,
- virConnectDomainEventGenericCallback cb,
+ virConnectObjectEventGenericCallback cb,
void *cbopaque,
void *opaque);
static void
virDomainEventDispatch(virDomainEventPtr event,
virObjectEventCallbackListPtr callbacks,
- virDomainEventDispatchFunc dispatch,
+ virObjectEventDispatchFunc dispatch,
void *opaque)
{
size_t i;
static void
virObjectEventQueueDispatch(virObjectEventQueuePtr queue,
virObjectEventCallbackListPtr callbacks,
- virDomainEventDispatchFunc dispatch,
+ virObjectEventDispatchFunc dispatch,
void *opaque)
{
size_t i;
static void
virObjectEventStateDispatchFunc(virConnectPtr conn,
virDomainEventPtr event,
- virConnectDomainEventGenericCallback cb,
+ virConnectObjectEventGenericCallback cb,
void *cbopaque,
void *opaque)
{
/* Drop the lock whle dispatching, for sake of re-entrancy */
virObjectEventStateUnlock(state);
- virDomainEventDispatchDefaultFunc(conn, event, cb, cbopaque, NULL);
+ virDomainEventDispatchDefaultFunc(conn, event,
+ VIR_DOMAIN_EVENT_CALLBACK(cb), cbopaque, NULL);
virObjectEventStateLock(state);
}
}
+/**
+ * virObjectEventStateRegisterID:
+ * @conn: connection to associate with callback
+ * @state: domain event state
+ * @eventID: ID of the event type to register for
+ * @cb: function to remove from event
+ * @opaque: data blob to pass to callback
+ * @freecb: callback to free @opaque
+ * @callbackID: filled with callback ID
+ *
+ * Register the function @callbackID with connection @conn,
+ * from @state, for events of type @eventID.
+ *
+ * Returns: the number of callbacks now registered, or -1 on error
+ */
+int
+virObjectEventStateRegisterID(virConnectPtr conn,
+ virObjectEventStatePtr state,
+ unsigned char *uuid,
+ const char *name,
+ int id,
+ int eventID,
+ virConnectObjectEventGenericCallback cb,
+ void *opaque,
+ virFreeCallback freecb,
+ int *callbackID)
+{
+ int ret = -1;
+
+ virObjectEventStateLock(state);
+
+ if ((state->callbacks->count == 0) &&
+ (state->timer == -1) &&
+ (state->timer = virEventAddTimeout(-1,
+ virDomainEventTimer,
+ state,
+ NULL)) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("could not initialize domain event timer"));
+ goto cleanup;
+ }
+
+ ret = virObjectEventCallbackListAddID(conn, state->callbacks,
+ uuid, name, id, eventID, cb, opaque, freecb,
+ callbackID);
+
+ if (ret == -1 &&
+ state->callbacks->count == 0 &&
+ state->timer != -1) {
+ virEventRemoveTimeout(state->timer);
+ state->timer = -1;
+ }
+
+cleanup:
+ virObjectEventStateUnlock(state);
+ return ret;
+}
+
+
/**
* virDomainEventStateRegister:
* @conn: connection to associate with callback
virFreeCallback freecb,
int *callbackID)
{
- int ret = -1;
-
- virObjectEventStateLock(state);
-
- if ((state->callbacks->count == 0) &&
- (state->timer == -1) &&
- (state->timer = virEventAddTimeout(-1,
- virDomainEventTimer,
- state,
- NULL)) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("could not initialize domain event timer"));
- goto cleanup;
- }
-
- 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 &&
- state->timer != -1) {
- virEventRemoveTimeout(state->timer);
- state->timer = -1;
- }
-
-cleanup:
- virObjectEventStateUnlock(state);
- return ret;
+ if (dom)
+ return virObjectEventStateRegisterID(conn, state, dom->uuid, dom->name,
+ dom->id, eventID,
+ VIR_OBJECT_EVENT_CALLBACK(cb),
+ opaque, freecb, callbackID);
+ else
+ return virObjectEventStateRegisterID(conn, state, NULL, NULL, 0,
+ eventID,
+ VIR_OBJECT_EVENT_CALLBACK(cb),
+ opaque, freecb, callbackID);
}