
On Sun, Nov 30, 2008 at 11:33:06PM +0000, Daniel P. Berrange wrote:
This patch makes the QEMU driver threadsafe with the exception of the domain events code. @@ -229,20 +243,22 @@ qemudStartup(void) { [...] +error: + if (qemu_driver) + qemuDriverUnlock(qemu_driver); VIR_FREE(base); - VIR_FREE(qemu_driver); + qemudShutdown();
okay the clean way to free the driver structure
@@ -314,16 +334,16 @@ qemudShutdown(void) { if (!qemu_driver) return -1;
+ qemuDriverLock(qemu_driver); virCapabilitiesFree(qemu_driver->caps);
/* shutdown active VMs */ for (i = 0 ; i < qemu_driver->domains.count ; i++) { virDomainObjPtr dom = qemu_driver->domains.objs[i]; + virDomainObjLock(dom); if (virDomainIsActive(dom)) qemudShutdownVMDaemon(NULL, qemu_driver, dom); - if (!dom->persistent) - virDomainRemoveInactive(&qemu_driver->domains, - dom); + virDomainObjUnlock(dom); }
virDomainObjListFree(&qemu_driver->domains); @@ -340,6 +360,7 @@ qemudShutdown(void) { if (qemu_driver->brctl) brShutdown(qemu_driver->brctl);
+ qemuDriverUnlock(qemu_driver); VIR_FREE(qemu_driver);
return 0;
We don't remove anymore the non-persistent domain on shutdown ? Is that because we can hook this to the event lifecycle processing ?
@@ -1089,18 +1087,38 @@ qemudDispatchVMEvent(int watch, int fd, [...] + if (failed || quit) { + qemudShutdownVMDaemon(NULL, driver, vm); + qemudDomainEventDispatch(driver, vm, + VIR_DOMAIN_EVENT_STOPPED, + quit ? + VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN : + VIR_DOMAIN_EVENT_STOPPED_FAILED); + if (!vm->persistent) { + virDomainRemoveInactive(&driver->domains, + vm); + vm = NULL; + } + }
seems to be done here now, okay I could not spot anything on the locking side, +1 Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/