Signed-off-by: Cole Robinson <crobinso(a)redhat.com>
---
src/test/test_driver.c | 104 ++++++++++++++---------------------------------
1 files changed, 31 insertions(+), 73 deletions(-)
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index ddff160..87350e8 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -90,12 +90,7 @@ struct _testConn {
int numCells;
testCell cells[MAX_CELLS];
-
- /* An array of callbacks */
- virDomainEventCallbackListPtr domainEventCallbacks;
- virDomainEventQueuePtr domainEventQueue;
- int domainEventTimer;
- int domainEventDispatching;
+ virDomainEventStatePtr domainEventState;
};
typedef struct _testConn testConn;
typedef struct _testConn *testConnPtr;
@@ -1124,6 +1119,7 @@ static virDrvOpenStatus testOpen(virConnectPtr conn,
int flags ATTRIBUTE_UNUSED)
{
int ret;
+ testConnPtr privconn;
if (!conn->uri)
return VIR_DRV_OPEN_DECLINED;
@@ -1150,26 +1146,24 @@ static virDrvOpenStatus testOpen(virConnectPtr conn,
ret = testOpenFromFile(conn,
conn->uri->path);
- if (ret == VIR_DRV_OPEN_SUCCESS) {
- testConnPtr privconn = conn->privateData;
- testDriverLock(privconn);
- /* Init callback list */
- if (VIR_ALLOC(privconn->domainEventCallbacks) < 0 ||
- !(privconn->domainEventQueue = virDomainEventQueueNew())) {
- virReportOOMError();
- testDriverUnlock(privconn);
- testClose(conn);
- return VIR_DRV_OPEN_ERROR;
- }
+ if (ret != VIR_DRV_OPEN_SUCCESS)
+ return ret;
+
+ privconn = conn->privateData;
+ testDriverLock(privconn);
- if ((privconn->domainEventTimer =
- virEventAddTimeout(-1, testDomainEventFlush, privconn, NULL)) < 0)
- DEBUG0("virEventAddTimeout failed: No addTimeoutImpl defined. "
- "continuing without events.");
+ privconn->domainEventState = virDomainEventStateNew(testDomainEventFlush,
+ privconn,
+ NULL);
+ if (!privconn->domainEventState) {
testDriverUnlock(privconn);
+ testClose(conn);
+ return VIR_DRV_OPEN_ERROR;
}
- return (ret);
+ testDriverUnlock(privconn);
+
+ return VIR_DRV_OPEN_SUCCESS;
}
static int testClose(virConnectPtr conn)
@@ -1182,12 +1176,7 @@ static int testClose(virConnectPtr conn)
virNetworkObjListFree(&privconn->networks);
virInterfaceObjListFree(&privconn->ifaces);
virStoragePoolObjListFree(&privconn->pools);
-
- virDomainEventCallbackListFree(privconn->domainEventCallbacks);
- virDomainEventQueueFree(privconn->domainEventQueue);
-
- if (privconn->domainEventTimer != -1)
- virEventRemoveTimeout(privconn->domainEventTimer);
+ virDomainEventStateFree(privconn->domainEventState);
testDriverUnlock(privconn);
virMutexDestroy(&privconn->lock);
@@ -5177,7 +5166,8 @@ testDomainEventRegister(virConnectPtr conn,
int ret;
testDriverLock(driver);
- ret = virDomainEventCallbackListAdd(conn, driver->domainEventCallbacks,
+ ret = virDomainEventCallbackListAdd(conn,
+ driver->domainEventState->callbacks,
callback, opaque, freecb);
testDriverUnlock(driver);
@@ -5193,12 +5183,9 @@ testDomainEventDeregister(virConnectPtr conn,
int ret;
testDriverLock(driver);
- if (driver->domainEventDispatching)
- ret = virDomainEventCallbackListMarkDelete(conn,
driver->domainEventCallbacks,
- callback);
- else
- ret = virDomainEventCallbackListRemove(conn, driver->domainEventCallbacks,
- callback);
+ ret = virDomainEventStateDeregister(conn,
+ driver->domainEventState,
+ callback);
testDriverUnlock(driver);
return ret;
@@ -5217,7 +5204,8 @@ testDomainEventRegisterAny(virConnectPtr conn,
int ret;
testDriverLock(driver);
- ret = virDomainEventCallbackListAddID(conn, driver->domainEventCallbacks,
+ ret = virDomainEventCallbackListAddID(conn,
+ driver->domainEventState->callbacks,
dom, eventID,
callback, opaque, freecb);
testDriverUnlock(driver);
@@ -5233,12 +5221,9 @@ testDomainEventDeregisterAny(virConnectPtr conn,
int ret;
testDriverLock(driver);
- if (driver->domainEventDispatching)
- ret = virDomainEventCallbackListMarkDeleteID(conn,
driver->domainEventCallbacks,
- callbackID);
- else
- ret = virDomainEventCallbackListRemoveID(conn, driver->domainEventCallbacks,
- callbackID);
+ ret = virDomainEventStateDeregisterAny(conn,
+ driver->domainEventState,
+ callbackID);
testDriverUnlock(driver);
return ret;
@@ -5262,28 +5247,11 @@ static void testDomainEventDispatchFunc(virConnectPtr conn,
static void testDomainEventFlush(int timer ATTRIBUTE_UNUSED, void *opaque)
{
testConnPtr driver = opaque;
- virDomainEventQueue tempQueue;
testDriverLock(driver);
-
- driver->domainEventDispatching = 1;
-
- /* Copy the queue, so we're reentrant safe */
- tempQueue.count = driver->domainEventQueue->count;
- tempQueue.events = driver->domainEventQueue->events;
- driver->domainEventQueue->count = 0;
- driver->domainEventQueue->events = NULL;
-
- virEventUpdateTimeout(driver->domainEventTimer, -1);
- virDomainEventQueueDispatch(&tempQueue,
- driver->domainEventCallbacks,
- testDomainEventDispatchFunc,
- driver);
-
- /* Purge any deleted callbacks */
- virDomainEventCallbackListPurgeMarked(driver->domainEventCallbacks);
-
- driver->domainEventDispatching = 0;
+ virDomainEventStateFlush(driver->domainEventState,
+ testDomainEventDispatchFunc,
+ driver);
testDriverUnlock(driver);
}
@@ -5292,17 +5260,7 @@ static void testDomainEventFlush(int timer ATTRIBUTE_UNUSED, void
*opaque)
static void testDomainEventQueue(testConnPtr driver,
virDomainEventPtr event)
{
- if (driver->domainEventTimer < 0) {
- virDomainEventFree(event);
- return;
- }
-
- if (virDomainEventQueuePush(driver->domainEventQueue,
- event) < 0)
- virDomainEventFree(event);
-
- if (driver->domainEventQueue->count == 1)
- virEventUpdateTimeout(driver->domainEventTimer, 0);
+ virDomainEventStateQueue(driver->domainEventState, event);
}
static virDrvOpenStatus testSecretOpen(virConnectPtr conn,
--
1.7.3.3