From 41ae9ece21eccad7b1a6262d0a473572f0a4b75f Mon Sep 17 00:00:00 2001 From: Adam Litke Date: Fri, 15 Jan 2010 08:34:02 -0600 Subject: [PATCH] QMP: Emit asynchronous events on all QMP monitors When using a control/QMP monitor in tandem with a regular monitor, asynchronous messages can get lost depending on the order of the QEMU program arguments. QEMU events issued by monitor_protocol_event() always go to cur_mon. If the user monitor was specified on the command line first (or it has ,default), the message will be directed to the user monitor (not the QMP monitor). Additionally, only one QMP session is currently able to receive async messages. To avoid this confusion, scan through the list of monitors and emit the message on each QMP monitor. Signed-off-by: Adam Litke Signed-off-by: Anthony Liguori (cherry picked from commit f039a563f200beee80cc10fd70b21ea396979dab) --- monitor.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/monitor.c b/monitor.c index 2403a979e4..bd4ee022d0 100644 --- a/monitor.c +++ b/monitor.c @@ -334,13 +334,10 @@ void monitor_protocol_event(MonitorEvent event, QObject *data) { QDict *qmp; const char *event_name; - Monitor *mon = cur_mon; + Monitor *mon; assert(event < QEVENT_MAX); - if (!monitor_ctrl_mode(mon)) - return; - switch (event) { case QEVENT_DEBUG: event_name = "DEBUG"; @@ -370,7 +367,12 @@ void monitor_protocol_event(MonitorEvent event, QObject *data) qdict_put_obj(qmp, "data", data); } - monitor_json_emitter(mon, QOBJECT(qmp)); + QLIST_FOREACH(mon, &mon_list, entry) { + if (!monitor_ctrl_mode(mon)) + return; + + monitor_json_emitter(mon, QOBJECT(qmp)); + } QDECREF(qmp); } -- 2.11.4.GIT