Since libxl provides the domain ID in the event handler callback,
find the domain object based on the ID. This approach prevents
processing the callback on a domain that has already been reaped.
---
src/libxl/libxl_driver.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index 7484b83..e28b641 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -656,22 +656,22 @@ libxlVmReap(libxlDriverPrivatePtr driver,
* Handle previously registered event notification from libxenlight
*/
static void
-libxlEventHandler(void *data, const libxl_event *event)
+libxlEventHandler(void *data ATTRIBUTE_UNUSED, const libxl_event *event)
{
libxlDriverPrivatePtr driver = libxl_driver;
- virDomainObjPtr vm = data;
+ virDomainObjPtr vm = NULL;
virDomainEventPtr dom_event = NULL;
libxlDriverLock(driver);
- virObjectLock(vm);
+ vm = virDomainFindByID(&driver->domains, event->domid);
libxlDriverUnlock(driver);
+ if (!vm)
+ goto cleanup;
+
if (event->type == LIBXL_EVENT_TYPE_DOMAIN_SHUTDOWN) {
virDomainShutoffReason reason;
- if (event->domid != vm->def->id)
- goto cleanup;
-
switch (event->u.domain_shutdown.shutdown_reason) {
case LIBXL_SHUTDOWN_REASON_POWEROFF:
case LIBXL_SHUTDOWN_REASON_CRASH:
--
1.8.0.1