virMutex lock;
virDomainObjPtr vm;
- virLXCMonitorCallbacksPtr cb;
+ virLXCMonitorCallbacks cb;
virNetClientPtr client;
virNetClientProgramPtr program;
virLXCProtocolExitEventMsg *msg = evdata;
VIR_DEBUG("Event exit %d", msg->status);
- if (mon->cb->exitNotify)
- mon->cb->exitNotify(mon, msg->status, mon->vm);
+ if (mon->cb.exitNotify)
+ mon->cb.exitNotify(mon, msg->status, mon->vm);
}
virLXCMonitorCallbackEOFNotify eofNotify;
virDomainObjPtr vm;
- VIR_DEBUG("EOF notify");
+ VIR_DEBUG("EOF notify mon=%p", mon);
virLXCMonitorLock(mon);
- eofNotify = mon->cb->eofNotify;
+ eofNotify = mon->cb.eofNotify;
vm = mon->vm;
virLXCMonitorUnlock(mon);
- eofNotify(mon, vm);
+ if (eofNotify) {
+ VIR_DEBUG("EOF callback mon=%p vm=%p", mon, vm);
+ eofNotify(mon, vm);
+ } else {
+ VIR_DEBUG("No EOF callback");
+ }
}
static void virLXCMonitorCloseFreeCallback(void *opaque)
{
virLXCMonitorPtr mon = opaque;
- virObjectUnref(mon);;
+ virObjectUnref(mon);
}
goto error;
mon->vm = vm;
- mon->cb = cb;
+ memcpy(&mon->cb, cb, sizeof(mon->cb));
virObjectRef(mon);
virNetClientSetCloseCallback(mon->client, virLXCMonitorEOFNotify, mon,
virLXCMonitorPtr mon = opaque;
VIR_DEBUG("mon=%p", mon);
- if (mon->cb && mon->cb->destroy)
- (mon->cb->destroy)(mon, mon->vm);
+ if (mon->cb.destroy)
+ (mon->cb.destroy)(mon, mon->vm);
virMutexDestroy(&mon->lock);
virObjectUnref(mon->program);
}
void virLXCMonitorClose(virLXCMonitorPtr mon)
{
+ VIR_DEBUG("mon=%p", mon);
if (mon->client) {
+ /* When manually closing the monitor, we don't
+ * want to have callbacks back into us, since
+ * the caller is not re-entrant safe
+ */
+ VIR_DEBUG("Clear EOF callback mon=%p", mon);
+ mon->cb.eofNotify = NULL;
virNetClientClose(mon->client);
virObjectUnref(mon->client);
mon->client = NULL;
int ret = -1;
virDomainDefPtr savedDef;
+ VIR_DEBUG("Faking reboot");
+
if (conn) {
virConnectRef(conn);
autodestroy = true;
extern virLXCDriverPtr lxc_driver;
-static void virLXCProcessMonitorEOFNotify(virLXCMonitorPtr mon ATTRIBUTE_UNUSED,
+static void virLXCProcessMonitorEOFNotify(virLXCMonitorPtr mon,
virDomainObjPtr vm)
{
virLXCDriverPtr driver = lxc_driver;
virDomainEventPtr event = NULL;
virLXCDomainObjPrivatePtr priv;
+ VIR_DEBUG("mon=%p vm=%p", mon, vm);
+
lxcDriverLock(driver);
virDomainObjLock(vm);
lxcDriverUnlock(driver);