diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index b4f1889fbabaaa09d7e5fe1fec7b4799732f5584..212d0fcdfdfece51690dff9a0b18e9f385edbb12 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -181,26 +181,28 @@ libxlFDRegisterEventHook(void *priv, int fd, void **hndp, return -1; } + info->priv = priv; + /* + * Take a reference on the domain object. Reference is dropped in + * libxlEventHookInfoFree, ensuring the domain object outlives the fd + * event objects. + */ + virObjectRef(info->priv); + info->xl_priv = xl_priv; + if (events & POLLIN) vir_events |= VIR_EVENT_HANDLE_READABLE; if (events & POLLOUT) vir_events |= VIR_EVENT_HANDLE_WRITABLE; + info->id = virEventAddHandle(fd, vir_events, libxlFDEventCallback, info, libxlEventHookInfoFree); if (info->id < 0) { + virObjectUnref(info->priv); VIR_FREE(info); return -1; } - info->priv = priv; - /* - * Take a reference on the domain object. Reference is dropped in - * libxlEventHookInfoFree, ensuring the domain object outlives the fd - * event objects. - */ - virObjectRef(info->priv); - - info->xl_priv = xl_priv; *hndp = info; return 0; @@ -283,6 +285,15 @@ libxlTimeoutRegisterEventHook(void *priv, return -1; } + info->priv = priv; + /* + * Also take a reference on the domain object. Reference is dropped in + * libxlEventHookInfoFree, ensuring the domain object outlives the timeout + * event objects. + */ + virObjectRef(info->priv); + info->xl_priv = xl_priv; + gettimeofday(&now, NULL); timersub(&abs_t, &now, &res); /* Ensure timeout is not overflowed */ @@ -296,22 +307,14 @@ libxlTimeoutRegisterEventHook(void *priv, info->id = virEventAddTimeout(timeout, libxlTimerCallback, info, libxlEventHookInfoFree); if (info->id < 0) { + virObjectUnref(info->priv); VIR_FREE(info); return -1; } - info->priv = priv; - /* - * Also take a reference on the domain object. Reference is dropped in - * libxlEventHookInfoFree, ensuring the domain object outlives the timeout - * event objects. - */ - virObjectRef(info->priv); - virObjectLock(info->priv); LIBXL_EV_REG_APPEND(info->priv->timerRegistrations, info); virObjectUnlock(info->priv); - info->xl_priv = xl_priv; *hndp = info; return 0;