return ret;
}
+static void
+virDomainEventStateLock(virDomainEventStatePtr state)
+{
+ virMutexLock(&state->lock);
+}
+
+static void
+virDomainEventStateUnlock(virDomainEventStatePtr state)
+{
+ virMutexUnlock(&state->lock);
+}
+
/**
* virDomainEventStateFree:
* @list: virDomainEventStatePtr to free
if (state->timer != -1)
virEventRemoveTimeout(state->timer);
+
+ virMutexDestroy(&state->lock);
VIR_FREE(state);
}
goto error;
}
+ if (virMutexInit(&state->lock) < 0) {
+ virReportSystemError(errno, "%s",
+ _("unable to initialize state mutex"));
+ VIR_FREE(state);
+ goto error;
+ }
+
if (VIR_ALLOC(state->callbacks) < 0) {
virReportOOMError();
goto error;
return;
}
+ virDomainEventStateLock(state);
+
if (virDomainEventQueuePush(state->queue, event) < 0) {
VIR_DEBUG("Error adding event to queue");
virDomainEventFree(event);
if (state->queue->count == 1)
virEventUpdateTimeout(state->timer, 0);
+ virDomainEventStateUnlock(state);
}
void
{
virDomainEventQueue tempQueue;
+ virDomainEventStateLock(state);
state->isDispatching = true;
/* Copy the queue, so we're reentrant safe when dispatchFunc drops the
tempQueue.events = state->queue->events;
state->queue->count = 0;
state->queue->events = NULL;
-
virEventUpdateTimeout(state->timer, -1);
+ virDomainEventStateUnlock(state);
+
virDomainEventQueueDispatch(&tempQueue,
state->callbacks,
dispatchFunc,
opaque);
/* Purge any deleted callbacks */
+ virDomainEventStateLock(state);
virDomainEventCallbackListPurgeMarked(state->callbacks);
state->isDispatching = false;
+ virDomainEventStateUnlock(state);
}
int
virDomainEventStatePtr state,
virConnectDomainEventCallback callback)
{
+ int ret;
+
+ virDomainEventStateLock(state);
if (state->isDispatching)
- return virDomainEventCallbackListMarkDelete(conn,
- state->callbacks, callback);
+ ret = virDomainEventCallbackListMarkDelete(conn,
+ state->callbacks, callback);
else
- return virDomainEventCallbackListRemove(conn, state->callbacks, callback);
+ ret = virDomainEventCallbackListRemove(conn, state->callbacks, callback);
+ virDomainEventStateUnlock(state);
+ return ret;
}
int
virDomainEventStatePtr state,
int callbackID)
{
+ int ret;
+
+ virDomainEventStateLock(state);
if (state->isDispatching)
- return virDomainEventCallbackListMarkDeleteID(conn,
- state->callbacks, callbackID);
+ ret = virDomainEventCallbackListMarkDeleteID(conn,
+ state->callbacks, callbackID);
else
- return virDomainEventCallbackListRemoveID(conn,
- state->callbacks, callbackID);
+ ret = virDomainEventCallbackListRemoveID(conn,
+ state->callbacks, callbackID);
+ virDomainEventStateUnlock(state);
+ return ret;
}