
On Thu, May 12, 2011 at 01:14:30PM -0400, Cole Robinson wrote:
Signed-off-by: Cole Robinson <crobinso@redhat.com> --- src/libxl/libxl_conf.h | 6 +--- src/libxl/libxl_driver.c | 80 +++++++++++++-------------------------------- 2 files changed, 24 insertions(+), 62 deletions(-)
diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h index 8c87786..65110cf 100644 --- a/src/libxl/libxl_conf.h +++ b/src/libxl/libxl_conf.h @@ -61,11 +61,7 @@ struct _libxlDriverPrivate { virBitmapPtr reservedVNCPorts; virDomainObjList domains;
- /* A list of callbacks */ - virDomainEventCallbackListPtr domainEventCallbacks; - virDomainEventQueuePtr domainEventQueue; - int domainEventTimer; - int domainEventDispatching; + virDomainEventStatePtr domainEventState;
char *configDir; char *autostartDir; diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index d7ff0c6..a1c4509 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -130,28 +130,11 @@ static void libxlDomainEventFlush(int timer ATTRIBUTE_UNUSED, void *opaque) { libxlDriverPrivatePtr driver = opaque; - virDomainEventQueue tempQueue;
libxlDriverLock(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, - libxlDomainEventDispatchFunc, - driver); - - /* Purge any deleted callbacks */ - virDomainEventCallbackListPurgeMarked(driver->domainEventCallbacks); - - driver->domainEventDispatching = 0; + virDomainEventStateFlush(driver->domainEventState, + libxmlDomainEventDispatchFunc, + driver); libxlDriverUnlock(driver); }
@@ -159,10 +142,7 @@ libxlDomainEventFlush(int timer ATTRIBUTE_UNUSED, void *opaque) static void libxlDomainEventQueue(libxlDriverPrivatePtr driver, virDomainEventPtr event) { - if (virDomainEventQueuePush(driver->domainEventQueue, event) < 0) - virDomainEventFree(event); - if (driver->domainEventQueue->count == 1) - virEventUpdateTimeout(driver->domainEventTimer, 0); + virDomainEventStateQueue(driver->domainEventState, event); }
/* @@ -706,12 +686,7 @@ libxlShutdown(void) VIR_FREE(libxl_driver->libDir); VIR_FREE(libxl_driver->saveDir);
- /* Free domain callback list */ - virDomainEventCallbackListFree(libxl_driver->domainEventCallbacks); - virDomainEventQueueFree(libxl_driver->domainEventQueue); - - if (libxl_driver->domainEventTimer != -1) - virEventRemoveTimeout(libxl_driver->domainEventTimer); + virDomainEventStateFree(privconn->domainEventState);
libxlDriverUnlock(libxl_driver); virMutexDestroy(&libxl_driver->lock); @@ -822,16 +797,14 @@ libxlStartup(int privileged) { } VIR_FREE(log_file);
- /* Init callback list */ - if (VIR_ALLOC(libxl_driver->domainEventCallbacks) < 0) - goto out_of_memory; - if (!(libxl_driver->domainEventQueue = virDomainEventQueueNew())) - goto out_of_memory; - if ((libxl_driver->domainEventTimer = - virEventAddTimeout(-1, libxlDomainEventFlush, libxl_driver, NULL)) < 0) + libxl_driver->domainEventState = virDomainEventStateNew( + libxlDomainEventFlush, + libxml_driver, + NULL, + false); + if (!libxml_driver->domainEventState) goto error;
- libxl_driver->logger = (xentoollog_logger *)xtl_createlogger_stdiostream(libxl_driver->logger_file, XTL_DEBUG, 0); if (!libxl_driver->logger) { @@ -982,7 +955,8 @@ libxlClose(virConnectPtr conn ATTRIBUTE_UNUSED) libxlDriverPrivatePtr driver = conn->privateData;
libxlDriverLock(driver); - virDomainEventCallbackListRemoveConn(conn, driver->domainEventCallbacks); + virDomainEventCallbackListRemoveConn(conn, + driver->domainEventState->callbacks); libxlDriverUnlock(driver); conn->privateData = NULL; return 0; @@ -2224,7 +2198,8 @@ libxlDomainEventRegister(virConnectPtr conn, int ret;
libxlDriverLock(driver); - ret = virDomainEventCallbackListAdd(conn, driver->domainEventCallbacks, + ret = virDomainEventCallbackListAdd(conn, + driver->domainEventState->callbacks, callback, opaque, freecb); libxlDriverUnlock(driver);
@@ -2240,14 +2215,9 @@ libxlDomainEventDeregister(virConnectPtr conn, int ret;
libxlDriverLock(driver); - if (driver->domainEventDispatching) - ret = virDomainEventCallbackListMarkDelete(conn, - driver->domainEventCallbacks, - callback); - else - ret = virDomainEventCallbackListRemove(conn, - driver->domainEventCallbacks, - callback); + ret = virDomainEventStateDeregister(conn, + driver->domainEventState, + callback); libxlDriverUnlock(driver);
return ret; @@ -2648,7 +2618,8 @@ libxlDomainEventRegisterAny(virConnectPtr conn, virDomainPtr dom, int eventID, int ret;
libxlDriverLock(driver); - ret = virDomainEventCallbackListAddID(conn, driver->domainEventCallbacks, + ret = virDomainEventCallbackListAddID(conn, + driver->domainEventState->callbacks, dom, eventID, callback, opaque, freecb); libxlDriverUnlock(driver); @@ -2664,14 +2635,9 @@ libxlDomainEventDeregisterAny(virConnectPtr conn, int callbackID) int ret;
libxlDriverLock(driver); - if (driver->domainEventDispatching) - ret = virDomainEventCallbackListMarkDeleteID(conn, - driver->domainEventCallbacks, - callbackID); - else - ret = virDomainEventCallbackListRemoveID(conn, - driver->domainEventCallbacks, - callbackID); + ret = virDomainEventStateDeregisterAny(conn, + driver->domainEventState, + callbackID); libxlDriverUnlock(driver);
return ret;
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 :|