struct libxlShutdownThreadInfo
{
libxlDriverPrivatePtr driver;
- virDomainObjPtr vm;
libxl_event *event;
};
libxlDomainShutdownThread(void *opaque)
{
struct libxlShutdownThreadInfo *shutdown_info = opaque;
- virDomainObjPtr vm = shutdown_info->vm;
+ virDomainObjPtr vm = NULL;
libxl_event *ev = shutdown_info->event;
libxlDriverPrivatePtr driver = shutdown_info->driver;
virObjectEventPtr dom_event = NULL;
cfg = libxlDriverConfigGet(driver);
+ vm = virDomainObjListFindByIDRef(driver->domains, ev->domid);
+ if (!vm) {
+ VIR_INFO("Received event for unknown domain ID %d", ev->domid);
+ goto cleanup;
+ }
+
if (libxlDomainObjBeginJob(driver, vm, LIBXL_JOB_MODIFY) < 0)
goto cleanup;
libxlDomainEventHandler(void *data, VIR_LIBXL_EVENT_CONST libxl_event *event)
{
libxlDriverPrivatePtr driver = data;
- virDomainObjPtr vm = NULL;
libxl_shutdown_reason xl_reason = event->u.domain_shutdown.shutdown_reason;
struct libxlShutdownThreadInfo *shutdown_info = NULL;
virThread thread;
if (xl_reason == LIBXL_SHUTDOWN_REASON_SUSPEND)
goto error;
- vm = virDomainObjListFindByIDRef(driver->domains, event->domid);
- if (!vm) {
- VIR_INFO("Received event for unknown domain ID %d", event->domid);
- goto error;
- }
-
/*
* Start a thread to handle shutdown. We don't want to be tying up
* libxl's event machinery by doing a potentially lengthy shutdown.
goto error;
shutdown_info->driver = driver;
- shutdown_info->vm = vm;
shutdown_info->event = (libxl_event *)event;
if (virThreadCreate(&thread, false, libxlDomainShutdownThread,
shutdown_info) < 0) {
}
/*
- * VM is unlocked and libxl_event freed in shutdown thread
+ * libxlShutdownThreadInfo and libxl_event are freed in shutdown thread
*/
return;
/* Cast away any const */
libxl_event_free(cfg->ctx, (libxl_event *)event);
virObjectUnref(cfg);
- virDomainObjEndAPI(&vm);
VIR_FREE(shutdown_info);
}