#include "datatypes.h"
#include "viralloc.h"
#include "virerror.h"
+#include "virobject.h"
#include "virstring.h"
#define VIR_FROM_THIS VIR_FROM_NONE
typedef virObjectEventQueue *virObjectEventQueuePtr;
struct _virObjectEventState {
+ virObjectLockable parent;
/* The list of domain event callbacks */
virObjectEventCallbackListPtr callbacks;
/* The queue of object events */
int timer;
/* Flag if we're in process of dispatching */
bool isDispatching;
- virMutex lock;
};
static virClassPtr virObjectEventClass;
+static virClassPtr virObjectEventStateClass;
static void virObjectEventDispose(void *obj);
+static void virObjectEventStateDispose(void *obj);
static int
virObjectEventOnceInit(void)
{
+ if (!(virObjectEventStateClass =
+ virClassNew(virClassForObjectLockable(),
+ "virObjectEventState",
+ sizeof(virObjectEventState),
+ virObjectEventStateDispose)))
+ return -1;
+
if (!(virObjectEventClass =
virClassNew(virClassForObject(),
"virObjectEvent",
sizeof(virObjectEvent),
virObjectEventDispose)))
return -1;
+
return 0;
}
/**
- * virObjectEventStateLock:
- * @state: the event state object
- *
- * Lock event state before calling functions from object_event_private.h.
- */
-static void
-virObjectEventStateLock(virObjectEventStatePtr state)
-{
- virMutexLock(&state->lock);
-}
-
-
-/**
- * virObjectEventStateUnlock:
- * @state: the event state object
- *
- * Unlock event state after calling functions from object_event_private.h.
- */
-static void
-virObjectEventStateUnlock(virObjectEventStatePtr state)
-{
- virMutexUnlock(&state->lock);
-}
-
-
-/**
- * virObjectEventStateFree:
+ * virObjectEventStateDispose:
* @list: virObjectEventStatePtr to free
*
* Free a virObjectEventStatePtr and its members, and unregister the timer.
*/
-void
-virObjectEventStateFree(virObjectEventStatePtr state)
+static void
+virObjectEventStateDispose(void *obj)
{
- if (!state)
- return;
+ virObjectEventStatePtr state = obj;
+
+ VIR_DEBUG("obj=%p", state);
virObjectEventCallbackListFree(state->callbacks);
virObjectEventQueueFree(state->queue);
if (state->timer != -1)
virEventRemoveTimeout(state->timer);
-
- virMutexDestroy(&state->lock);
- VIR_FREE(state);
}
{
virObjectEventStatePtr state = NULL;
- if (VIR_ALLOC(state) < 0)
- goto error;
+ if (virObjectEventInitialize() < 0)
+ return NULL;
- if (virMutexInit(&state->lock) < 0) {
- virReportSystemError(errno, "%s",
- _("unable to initialize state mutex"));
- VIR_FREE(state);
- goto error;
- }
+ if (!(state = virObjectLockableNew(virObjectEventStateClass)))
+ return NULL;
if (VIR_ALLOC(state->callbacks) < 0)
goto error;
return state;
error:
- virObjectEventStateFree(state);
+ virObjectUnref(state);
return NULL;
}
continue;
/* Drop the lock whle dispatching, for sake of re-entrancy */
- virObjectEventStateUnlock(state);
+ virObjectUnlock(state);
event->dispatch(cb->conn, event, cb->cb, cb->opaque);
- virObjectEventStateLock(state);
+ virObjectLock(state);
}
}
return;
}
- virObjectEventStateLock(state);
+ virObjectLock(state);
event->remoteID = remoteID;
if (virObjectEventQueuePush(state->queue, event) < 0) {
if (state->queue->count == 1)
virEventUpdateTimeout(state->timer, 0);
- virObjectEventStateUnlock(state);
+ virObjectUnlock(state);
}
{
virObjectEventQueue tempQueue;
- virObjectEventStateLock(state);
+ virObjectLock(state);
state->isDispatching = true;
/* Copy the queue, so we're reentrant safe when dispatchFunc drops the
virObjectEventCallbackListPurgeMarked(state->callbacks);
state->isDispatching = false;
- virObjectEventStateUnlock(state);
+ virObjectUnlock(state);
}
{
int ret = -1;
- virObjectEventStateLock(state);
+ virObjectLock(state);
if ((state->callbacks->count == 0) &&
(state->timer == -1) &&
}
cleanup:
- virObjectEventStateUnlock(state);
+ virObjectUnlock(state);
return ret;
}
{
int ret;
- virObjectEventStateLock(state);
+ virObjectLock(state);
if (state->isDispatching)
ret = virObjectEventCallbackListMarkDeleteID(conn,
state->callbacks,
virObjectEventQueueClear(state->queue);
}
- virObjectEventStateUnlock(state);
+ virObjectUnlock(state);
return ret;
}
{
int ret = -1;
- virObjectEventStateLock(state);
+ virObjectLock(state);
ret = virObjectEventCallbackLookup(conn, state->callbacks, NULL,
klass, eventID, callback, true,
remoteID);
- virObjectEventStateUnlock(state);
+ virObjectUnlock(state);
if (ret < 0)
virReportError(VIR_ERR_INVALID_ARG,
size_t i;
virObjectEventCallbackListPtr cbList = state->callbacks;
- virObjectEventStateLock(state);
+ virObjectLock(state);
for (i = 0; i < cbList->count; i++) {
virObjectEventCallbackPtr cb = cbList->callbacks[i];
break;
}
}
- virObjectEventStateUnlock(state);
+ virObjectUnlock(state);
if (ret < 0)
virReportError(VIR_ERR_INVALID_ARG,
{
size_t i;
- virObjectEventStateLock(state);
+ virObjectLock(state);
for (i = 0; i < state->callbacks->count; i++) {
virObjectEventCallbackPtr cb = state->callbacks->callbacks[i];
break;
}
}
- virObjectEventStateUnlock(state);
+ virObjectUnlock(state);
}