Change virDomainEventState to virObjectLockable

This way we get reference counting and we can get rid of locking
function.

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
This commit is contained in:
Martin Kletzander 2016-10-11 09:48:36 +02:00
parent 8ee8f939fe
commit 1827f2ac5d
17 changed files with 52 additions and 76 deletions

1
cfg.mk
View File

@ -127,7 +127,6 @@ useless_free_options = \
--name=virDomainDiskDefFree \
--name=virDomainEventCallbackListFree \
--name=virObjectEventQueueFree \
--name=virObjectEventStateFree \
--name=virDomainFSDefFree \
--name=virDomainGraphicsDefFree \
--name=virDomainHostdevDefFree \

View File

@ -1198,7 +1198,7 @@ bhyveStateCleanup(void)
virObjectUnref(bhyve_driver->xmlopt);
virSysinfoDefFree(bhyve_driver->hostsysinfo);
virObjectUnref(bhyve_driver->closeCallbacks);
virObjectEventStateFree(bhyve_driver->domainEventState);
virObjectUnref(bhyve_driver->domainEventState);
virMutexDestroy(&bhyve_driver->lock);
VIR_FREE(bhyve_driver);

View File

@ -32,6 +32,7 @@
#include "datatypes.h"
#include "viralloc.h"
#include "virerror.h"
#include "virobject.h"
#include "virstring.h"
#define VIR_FROM_THIS VIR_FROM_NONE
@ -71,6 +72,7 @@ typedef struct _virObjectEventQueue virObjectEventQueue;
typedef virObjectEventQueue *virObjectEventQueuePtr;
struct _virObjectEventState {
virObjectLockable parent;
/* The list of domain event callbacks */
virObjectEventCallbackListPtr callbacks;
/* The queue of object events */
@ -79,22 +81,31 @@ struct _virObjectEventState {
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;
}
@ -504,51 +515,23 @@ virObjectEventQueueNew(void)
/**
* 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);
}
@ -583,15 +566,11 @@ virObjectEventStateNew(void)
{
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;
@ -604,7 +583,7 @@ virObjectEventStateNew(void)
return state;
error:
virObjectEventStateFree(state);
virObjectUnref(state);
return NULL;
}
@ -727,9 +706,9 @@ virObjectEventStateDispatchCallbacks(virObjectEventStatePtr state,
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);
}
}
@ -773,7 +752,7 @@ virObjectEventStateQueueRemote(virObjectEventStatePtr state,
return;
}
virObjectEventStateLock(state);
virObjectLock(state);
event->remoteID = remoteID;
if (virObjectEventQueuePush(state->queue, event) < 0) {
@ -783,7 +762,7 @@ virObjectEventStateQueueRemote(virObjectEventStatePtr state,
if (state->queue->count == 1)
virEventUpdateTimeout(state->timer, 0);
virObjectEventStateUnlock(state);
virObjectUnlock(state);
}
@ -809,7 +788,7 @@ virObjectEventStateFlush(virObjectEventStatePtr state)
{
virObjectEventQueue tempQueue;
virObjectEventStateLock(state);
virObjectLock(state);
state->isDispatching = true;
/* Copy the queue, so we're reentrant safe when dispatchFunc drops the
@ -829,7 +808,7 @@ virObjectEventStateFlush(virObjectEventStatePtr state)
virObjectEventCallbackListPurgeMarked(state->callbacks);
state->isDispatching = false;
virObjectEventStateUnlock(state);
virObjectUnlock(state);
}
@ -884,7 +863,7 @@ virObjectEventStateRegisterID(virConnectPtr conn,
{
int ret = -1;
virObjectEventStateLock(state);
virObjectLock(state);
if ((state->callbacks->count == 0) &&
(state->timer == -1) &&
@ -911,7 +890,7 @@ virObjectEventStateRegisterID(virConnectPtr conn,
}
cleanup:
virObjectEventStateUnlock(state);
virObjectUnlock(state);
return ret;
}
@ -934,7 +913,7 @@ virObjectEventStateDeregisterID(virConnectPtr conn,
{
int ret;
virObjectEventStateLock(state);
virObjectLock(state);
if (state->isDispatching)
ret = virObjectEventCallbackListMarkDeleteID(conn,
state->callbacks,
@ -950,7 +929,7 @@ virObjectEventStateDeregisterID(virConnectPtr conn,
virObjectEventQueueClear(state->queue);
}
virObjectEventStateUnlock(state);
virObjectUnlock(state);
return ret;
}
@ -978,11 +957,11 @@ virObjectEventStateCallbackID(virConnectPtr conn,
{
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,
@ -1016,7 +995,7 @@ virObjectEventStateEventID(virConnectPtr conn,
size_t i;
virObjectEventCallbackListPtr cbList = state->callbacks;
virObjectEventStateLock(state);
virObjectLock(state);
for (i = 0; i < cbList->count; i++) {
virObjectEventCallbackPtr cb = cbList->callbacks[i];
@ -1030,7 +1009,7 @@ virObjectEventStateEventID(virConnectPtr conn,
break;
}
}
virObjectEventStateUnlock(state);
virObjectUnlock(state);
if (ret < 0)
virReportError(VIR_ERR_INVALID_ARG,
@ -1060,7 +1039,7 @@ virObjectEventStateSetRemote(virConnectPtr conn,
{
size_t i;
virObjectEventStateLock(state);
virObjectLock(state);
for (i = 0; i < state->callbacks->count; i++) {
virObjectEventCallbackPtr cb = state->callbacks->callbacks[i];
@ -1072,5 +1051,5 @@ virObjectEventStateSetRemote(virConnectPtr conn,
break;
}
}
virObjectEventStateUnlock(state);
virObjectUnlock(state);
}

View File

@ -40,7 +40,6 @@ typedef struct _virObjectEventState virObjectEventState;
typedef virObjectEventState *virObjectEventStatePtr;
void virObjectEventStateFree(virObjectEventStatePtr state);
virObjectEventStatePtr
virObjectEventStateNew(void);

View File

@ -819,7 +819,6 @@ virNWFilterVarValueGetSimple;
# conf/object_event.h
virObjectEventStateDeregisterID;
virObjectEventStateEventID;
virObjectEventStateFree;
virObjectEventStateNew;
virObjectEventStateQueue;

View File

@ -479,7 +479,7 @@ libxlStateCleanup(void)
virObjectUnref(libxl_driver->migrationPorts);
virLockManagerPluginUnref(libxl_driver->lockManager);
virObjectEventStateFree(libxl_driver->domainEventState);
virObjectUnref(libxl_driver->domainEventState);
virSysinfoDefFree(libxl_driver->hostsysinfo);
virMutexDestroy(&libxl_driver->lock);

View File

@ -1781,7 +1781,7 @@ static int lxcStateCleanup(void)
virNWFilterUnRegisterCallbackDriver(&lxcCallbackDriver);
virObjectUnref(lxc_driver->domains);
virObjectEventStateFree(lxc_driver->domainEventState);
virObjectUnref(lxc_driver->domainEventState);
virObjectUnref(lxc_driver->closeCallbacks);

View File

@ -777,7 +777,7 @@ networkStateCleanup(void)
if (!network_driver)
return -1;
virObjectEventStateFree(network_driver->networkEventState);
virObjectUnref(network_driver->networkEventState);
/* free inactive networks */
virObjectUnref(network_driver->networks);

View File

@ -1269,7 +1269,7 @@ static int nodeStateCleanup(void)
nodeDeviceLock();
virObjectEventStateFree(driver->nodeDeviceEventState);
virObjectUnref(driver->nodeDeviceEventState);
priv = driver->privateData;

View File

@ -1094,7 +1094,7 @@ qemuStateCleanup(void)
ebtablesContextFree(qemu_driver->ebtables);
/* Free domain callback list */
virObjectEventStateFree(qemu_driver->domainEventState);
virObjectUnref(qemu_driver->domainEventState);
virLockManagerPluginUnref(qemu_driver->lockManager);

View File

@ -1343,7 +1343,7 @@ doRemoteClose(virConnectPtr conn, struct private_data *priv)
/* See comment for remoteType. */
VIR_FREE(priv->type);
virObjectEventStateFree(priv->eventState);
virObjectUnref(priv->eventState);
priv->eventState = NULL;
return ret;

View File

@ -347,7 +347,7 @@ storageStateCleanup(void)
storageDriverLock();
virObjectEventStateFree(driver->storageEventState);
virObjectUnref(driver->storageEventState);
/* free inactive pools */
virStoragePoolObjListFree(&driver->pools);

View File

@ -153,7 +153,7 @@ testDriverFree(testDriverPtr driver)
virObjectUnref(driver->networks);
virInterfaceObjListFree(&driver->ifaces);
virStoragePoolObjListFree(&driver->pools);
virObjectEventStateFree(driver->eventState);
virObjectUnref(driver->eventState);
virMutexUnlock(&driver->lock);
virMutexDestroy(&driver->lock);

View File

@ -685,7 +685,7 @@ umlStateCleanup(void)
virObjectUnref(uml_driver->domains);
virObjectEventStateFree(uml_driver->domainEventState);
virObjectUnref(uml_driver->domainEventState);
VIR_FREE(uml_driver->logDir);
VIR_FREE(uml_driver->configDir);

View File

@ -387,7 +387,7 @@ static void vboxUninitialize(vboxGlobalData *data)
virObjectUnref(data->caps);
virObjectUnref(data->xmlopt);
if (gVBoxAPI.domainEventCallbacks)
virObjectEventStateFree(data->domainEvents);
virObjectUnref(data->domainEvents);
VIR_FREE(data);
}

View File

@ -171,7 +171,7 @@ static void vzDriverDispose(void * obj)
virObjectUnref(driver->domains);
virObjectUnref(driver->caps);
virObjectUnref(driver->xmlopt);
virObjectEventStateFree(driver->domainEventState);
virObjectUnref(driver->domainEventState);
virSysinfoDefFree(driver->hostsysinfo);
}

View File

@ -571,7 +571,7 @@ xenUnifiedConnectClose(virConnectPtr conn)
virObjectUnref(priv->caps);
virObjectUnref(priv->xmlopt);
virObjectEventStateFree(priv->domainEvents);
virObjectUnref(priv->domainEvents);
#if WITH_XEN_INOTIFY
if (priv->opened[XEN_UNIFIED_INOTIFY_OFFSET])