virDomainChrDefPtr monConfig;
int monJSON;
int monitor_warned;
+ bool gotShutdown;
int nvcpupids;
int *vcpupids;
int hasError) {
struct qemud_driver *driver = qemu_driver;
virDomainEventPtr event = NULL;
+ qemuDomainObjPrivatePtr priv;
VIR_DEBUG("Received EOF on %p '%s'", vm, vm->def->name);
virDomainObjLock(vm);
+ priv = vm->privateData;
+ if (!hasError && priv->monJSON && !priv->gotShutdown) {
+ VIR_DEBUG("Monitor connection to '%s' closed without SHUTDOWN event; "
+ "assuming the domain crashed", vm->def->name);
+ hasError = 1;
+ }
+
event = virDomainEventNewFromObj(vm,
VIR_DOMAIN_EVENT_STOPPED,
hasError ?
}
+static int
+qemuHandleDomainShutdown(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
+ virDomainObjPtr vm)
+{
+ virDomainObjLock(vm);
+ ((qemuDomainObjPrivatePtr) vm->privateData)->gotShutdown = true;
+ virDomainObjUnlock(vm);
+
+ return 0;
+}
+
+
static int
qemuHandleDomainStop(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
virDomainObjPtr vm)
.destroy = qemuHandleMonitorDestroy,
.eofNotify = qemuHandleMonitorEOF,
.diskSecretLookup = findVolumeQcowPassphrase,
+ .domainShutdown = qemuHandleDomainShutdown,
.domainStop = qemuHandleDomainStop,
.domainReset = qemuHandleDomainReset,
.domainRTCChange = qemuHandleDomainRTCChange,
priv->monJSON = 0;
priv->monitor_warned = 0;
+ priv->gotShutdown = false;
if ((ret = virFileDeletePid(driver->stateDir, vm->def->name)) != 0) {
virReportSystemError(ret,