From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NVnfc-0003Nl-Nv for qemu-devel@nongnu.org; Fri, 15 Jan 2010 10:01:04 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NVnfX-0003NH-Qy for qemu-devel@nongnu.org; Fri, 15 Jan 2010 10:01:04 -0500 Received: from [199.232.76.173] (port=54604 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NVnfX-0003NB-OR for qemu-devel@nongnu.org; Fri, 15 Jan 2010 10:00:59 -0500 Received: from mx1.redhat.com ([209.132.183.28]:16877) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1NVnfX-00030v-3b for qemu-devel@nongnu.org; Fri, 15 Jan 2010 10:00:59 -0500 Date: Fri, 15 Jan 2010 13:00:51 -0200 From: Luiz Capitulino Message-ID: <20100115130051.024ff95b@doriath> In-Reply-To: <1263566042.3536.11.camel@aglitke> References: <1263504010.2847.27.camel@aglitke> <20100115113845.588e2398@doriath> <1263566042.3536.11.camel@aglitke> Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] Re: [PATCH] QMP: Emit asynchronous events on all QMP monitors List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Adam Litke Cc: qemu-devel@nongnu.org On Fri, 15 Jan 2010 08:34:02 -0600 Adam Litke wrote: > 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 > > diff --git a/monitor.c b/monitor.c > index 134ed15..06c8bf0 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"; > @@ -373,7 +370,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)); > + } The function will return on the first !QMP Monitor, the right QLIST_FOREACH() body is: if (monitor_ctrl_mode(mon)) { monitor_json_emitter(mon, QOBJECT(qmp)); } I'll ACK the respin. > QDECREF(qmp); > } > > >