if (virNetClientRegisterAsyncIO(mon->client) < 0)
goto error;
+ /* avoid deadlock by making this call before assigning virLXCMonitorEvents */
+ virNetClientSetCloseCallback(mon->client, virLXCMonitorEOFNotify, mon,
+ virLXCMonitorCloseFreeCallback);
+
+ /* close callback now has its own reference */
+ virObjectRef(mon);
+
if (!(mon->program = virNetClientProgramNew(VIR_LXC_MONITOR_PROGRAM,
VIR_LXC_MONITOR_PROGRAM_VERSION,
virLXCMonitorEvents,
mon->vm = virObjectRef(vm);
memcpy(&mon->cb, cb, sizeof(mon->cb));
- virObjectRef(mon);
- virNetClientSetCloseCallback(mon->client, virLXCMonitorEOFNotify, mon,
- virLXCMonitorCloseFreeCallback);
-
cleanup:
VIR_FREE(sockpath);
return mon;