aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Litke <agl@us.ibm.com>2010-01-15 08:34:02 -0600
committerAnthony Liguori <aliguori@us.ibm.com>2010-01-19 16:31:04 -0600
commitf039a563f200beee80cc10fd70b21ea396979dab (patch)
treed80ee92a06d613f01a26766f5859173a69ad202f
parentbeb6f0de7aa19ce62fdd21a876b8c171ac7fde2e (diff)
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 <agl@us.ibm.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
-rw-r--r--monitor.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/monitor.c b/monitor.c
index fea73834d0..938eb3b041 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";
@@ -379,7 +376,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);
}