qemuDomainSaveStatus(vm);
if (STREQ_NULLABLE(dev.data.chr->target.name, "org.qemu.guest_agent.0")) {
+ virObjectEvent *agentEvent = NULL;
if (newstate == VIR_DOMAIN_CHR_DEVICE_STATE_CONNECTED) {
if (qemuConnectAgent(driver, vm) < 0)
goto endjob;
priv->agentError = false;
}
- event = virDomainEventAgentLifecycleNewFromObj(vm, newstate,
- VIR_CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_REASON_CHANNEL);
- virObjectEventStateQueue(driver->domainEventState, event);
+ agentEvent = virDomainEventAgentLifecycleNewFromObj(vm, newstate,
+ VIR_CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_REASON_CHANNEL);
+ virObjectEventStateQueue(driver->domainEventState, agentEvent);
}
+ /* we deliberately allow for goto endjob to skip generic event emission
+ * to ensure identical semantics for "org.qemu.guest_agent.0" */
+ event = virDomainEventChannelLifecycleNewFromObj(vm,
+ dev.data.chr->target.name,
+ newstate,
+ VIR_CONNECT_DOMAIN_EVENT_CHANNEL_LIFECYCLE_REASON_CHANNEL);
+ virObjectEventStateQueue(driver->domainEventState, event);
+
endjob:
virDomainObjEndJob(vm);
}
size_t i;
int agentReason = VIR_CONNECT_DOMAIN_EVENT_AGENT_LIFECYCLE_REASON_CHANNEL;
qemuMonitorChardevInfo *entry;
- virObjectEvent *event = NULL;
g_autofree char *id = NULL;
if (booted)
for (i = 0; i < vm->def->nchannels; i++) {
virDomainChrDef *chr = vm->def->channels[i];
+ virObjectEvent *events[2] = { 0 };
+
if (chr->targetType == VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO) {
VIR_FREE(id);
!entry->state)
continue;
- if (entry->state != VIR_DOMAIN_CHR_DEVICE_STATE_DEFAULT &&
- STREQ_NULLABLE(chr->target.name, "org.qemu.guest_agent.0") &&
- (event = virDomainEventAgentLifecycleNewFromObj(vm, entry->state,
- agentReason)))
- virObjectEventStateQueue(driver->domainEventState, event);
+ if (entry->state != VIR_DOMAIN_CHR_DEVICE_STATE_DEFAULT) {
+ events[0] = virDomainEventChannelLifecycleNewFromObj(vm,
+ chr->target.name,
+ entry->state,
+ agentReason);
+ if (STREQ_NULLABLE(chr->target.name, "org.qemu.guest_agent.0")) {
+ events[1] = virDomainEventAgentLifecycleNewFromObj(vm,
+ entry->state,
+ agentReason);
+ }
+
+ /* emit agent then channel when emitting both events */
+ virObjectEventStateQueue(driver->domainEventState, events[1]);
+ virObjectEventStateQueue(driver->domainEventState, events[0]);
+ }
chr->state = entry->state;
}