static void qemuAgentDispose(void *obj)
{
qemuAgent *agent = obj;
+
VIR_DEBUG("agent=%p", agent);
- if (agent->cb && agent->cb->destroy)
- (agent->cb->destroy)(agent, agent->vm);
+
+ if (agent->vm)
+ virObjectUnref(agent->vm);
virCondDestroy(&agent->notify);
g_free(agent->buffer);
g_main_context_unref(agent->context);
virObjectUnref(agent);
return NULL;
}
- agent->vm = vm;
+ agent->vm = virObjectRef(vm);
agent->cb = cb;
agent->singleSync = singleSync;
return agent;
cleanup:
- /* We don't want the 'destroy' callback invoked during
- * cleanup from construction failure, because that can
- * give a double-unref on virDomainObj *in the caller,
- * so kill the callbacks now.
- */
- agent->cb = NULL;
qemuAgentClose(agent);
return NULL;
}
goto cleanup;
}
- /* Hold an extra reference because we can't allow 'vm' to be
- * deleted while the agent is active */
- virObjectRef(vm);
-
agent = qemuAgentOpen(vm,
config->source,
virEventThreadGetContext(priv->eventThread),
&agentCallbacks,
virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_VSERPORT_CHANGE));
- if (agent == NULL)
- virObjectUnref(vm);
-
if (!virDomainObjIsActive(vm)) {
qemuAgentClose(agent);
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",