On Thu, May 12, 2011 at 01:14:28PM -0400, Cole Robinson wrote:
v3:
Adjust for new virDomainEventStateNew argument
Signed-off-by: Cole Robinson <crobinso(a)redhat.com>
---
src/lxc/lxc_conf.h | 6 +---
src/lxc/lxc_driver.c | 74 ++++++++++++++-----------------------------------
2 files changed, 22 insertions(+), 58 deletions(-)
diff --git a/src/lxc/lxc_conf.h b/src/lxc/lxc_conf.h
index 4f1ead3..66aa469 100644
--- a/src/lxc/lxc_conf.h
+++ b/src/lxc/lxc_conf.h
@@ -55,11 +55,7 @@ struct __lxc_driver {
int log_libvirtd;
int have_netns;
- /* An array of callbacks */
- virDomainEventCallbackListPtr domainEventCallbacks;
- virDomainEventQueuePtr domainEventQueue;
- int domainEventTimer;
- int domainEventDispatching;
+ virDomainEventStatePtr domainEventState;
};
int lxcLoadDriverConfig(lxc_driver_t *driver);
diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
index 7a3e33d..31adcb7 100644
--- a/src/lxc/lxc_driver.c
+++ b/src/lxc/lxc_driver.c
@@ -159,7 +159,8 @@ static int lxcClose(virConnectPtr conn)
lxc_driver_t *driver = conn->privateData;
lxcDriverLock(driver);
- virDomainEventCallbackListRemoveConn(conn, driver->domainEventCallbacks);
+ virDomainEventCallbackListRemoveConn(conn,
+ driver->domainEventState->callbacks);
lxcDriverUnlock(driver);
conn->privateData = NULL;
@@ -1648,7 +1649,8 @@ lxcDomainEventRegister(virConnectPtr conn,
int ret;
lxcDriverLock(driver);
- ret = virDomainEventCallbackListAdd(conn, driver->domainEventCallbacks,
+ ret = virDomainEventCallbackListAdd(conn,
+ driver->domainEventState->callbacks,
callback, opaque, freecb);
lxcDriverUnlock(driver);
@@ -1664,12 +1666,9 @@ lxcDomainEventDeregister(virConnectPtr conn,
int ret;
lxcDriverLock(driver);
- if (driver->domainEventDispatching)
- ret = virDomainEventCallbackListMarkDelete(conn,
driver->domainEventCallbacks,
- callback);
- else
- ret = virDomainEventCallbackListRemove(conn, driver->domainEventCallbacks,
- callback);
+ ret = virDomainEventStateDeregister(conn,
+ driver->domainEventState,
+ callback);
lxcDriverUnlock(driver);
return ret;
@@ -1689,7 +1688,7 @@ lxcDomainEventRegisterAny(virConnectPtr conn,
lxcDriverLock(driver);
ret = virDomainEventCallbackListAddID(conn,
- driver->domainEventCallbacks,
+ driver->domainEventState->callbacks,
dom, eventID,
callback, opaque, freecb);
lxcDriverUnlock(driver);
@@ -1706,12 +1705,9 @@ lxcDomainEventDeregisterAny(virConnectPtr conn,
int ret;
lxcDriverLock(driver);
- if (driver->domainEventDispatching)
- ret = virDomainEventCallbackListMarkDeleteID(conn,
driver->domainEventCallbacks,
- callbackID);
- else
- ret = virDomainEventCallbackListRemoveID(conn, driver->domainEventCallbacks,
- callbackID);
+ ret = virDomainEventStateDeregisterAny(conn,
+ driver->domainEventState,
+ callbackID);
lxcDriverUnlock(driver);
return ret;
@@ -1736,28 +1732,11 @@ static void lxcDomainEventDispatchFunc(virConnectPtr conn,
static void lxcDomainEventFlush(int timer ATTRIBUTE_UNUSED, void *opaque)
{
lxc_driver_t *driver = opaque;
- virDomainEventQueue tempQueue;
lxcDriverLock(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,
- lxcDomainEventDispatchFunc,
- driver);
-
- /* Purge any deleted callbacks */
- virDomainEventCallbackListPurgeMarked(driver->domainEventCallbacks);
-
- driver->domainEventDispatching = 0;
+ virDomainEventStateFlush(driver->domainEventState,
+ lxcDomainEventDispatchFunc,
+ driver);
lxcDriverUnlock(driver);
}
@@ -1766,11 +1745,7 @@ static void lxcDomainEventFlush(int timer ATTRIBUTE_UNUSED, void
*opaque)
static void lxcDomainEventQueue(lxc_driver_t *driver,
virDomainEventPtr event)
{
- if (virDomainEventQueuePush(driver->domainEventQueue,
- event) < 0)
- virDomainEventFree(event);
- if (lxc_driver->domainEventQueue->count == 1)
- virEventUpdateTimeout(driver->domainEventTimer, 0);
+ virDomainEventStateQueue(driver->domainEventState, event);
}
/**
@@ -1985,13 +1960,11 @@ static int lxcStartup(int privileged)
if (virDomainObjListInit(&lxc_driver->domains) < 0)
goto cleanup;
- if (VIR_ALLOC(lxc_driver->domainEventCallbacks) < 0)
- goto cleanup;
- if (!(lxc_driver->domainEventQueue = virDomainEventQueueNew()))
- goto cleanup;
-
- if ((lxc_driver->domainEventTimer =
- virEventAddTimeout(-1, lxcDomainEventFlush, lxc_driver, NULL)) < 0)
+ lxc_driver->domainEventState = virDomainEventStateNew(lxcDomainEventFlush,
+ lxc_driver,
+ NULL,
+ true);
+ if (!lxc_driver->domainEventState)
goto cleanup;
lxc_driver->log_libvirtd = 0; /* by default log to container logfile */
@@ -2083,12 +2056,7 @@ static int lxcShutdown(void)
lxcDriverLock(lxc_driver);
virDomainObjListDeinit(&lxc_driver->domains);
-
- virDomainEventCallbackListFree(lxc_driver->domainEventCallbacks);
- virDomainEventQueueFree(lxc_driver->domainEventQueue);
-
- if (lxc_driver->domainEventTimer != -1)
- virEventRemoveTimeout(lxc_driver->domainEventTimer);
+ virDomainEventStateFree(lxc_driver->domainEventState);
virCapabilitiesFree(lxc_driver->caps);
VIR_FREE(lxc_driver->configDir);
ACK
Daniel
--
|:
http://berrange.com -o-
http://www.flickr.com/photos/dberrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|:
http://entangle-photo.org -o-
http://live.gnome.org/gtk-vnc :|