On Wed, 25 May 2011 19:48:00 +0100 Stefan Hajnoczi <stefa...@linux.vnet.ibm.com> wrote:
> The get_events() function polls for new QMP events and then returns. It > can be useful to wait for the next QMP event so add the boolean 'wait' > keyword argument. > > Signed-off-by: Stefan Hajnoczi <stefa...@linux.vnet.ibm.com> > --- > QMP/qmp.py | 11 ++++++++--- > 1 files changed, 8 insertions(+), 3 deletions(-) > > diff --git a/QMP/qmp.py b/QMP/qmp.py > index 14ce8b0..2565508 100644 > --- a/QMP/qmp.py > +++ b/QMP/qmp.py > @@ -43,7 +43,7 @@ class QEMUMonitorProtocol: > family = socket.AF_UNIX > return socket.socket(family, socket.SOCK_STREAM) > > - def __json_read(self): > + def __json_read(self, only_event=False): > while True: > data = self.__sockfile.readline() > if not data: > @@ -51,7 +51,8 @@ class QEMUMonitorProtocol: > resp = json.loads(data) > if 'event' in resp: > self.__events.append(resp) > - continue > + if not only_event: > + continue > return resp > > error = socket.error > @@ -106,9 +107,11 @@ class QEMUMonitorProtocol: > qmp_cmd['id'] = id > return self.cmd_obj(qmp_cmd) > > - def get_events(self): > + def get_events(self, wait=False): > """ > Get a list of available QMP events. > + > + @param wait: block until an event is available (bool) > """ > self.__sock.setblocking(0) > try: > @@ -118,6 +121,8 @@ class QEMUMonitorProtocol: > # No data available > pass > self.__sock.setblocking(1) > + if not self.__events and wait: > + self.__json_read(only_event=True) > return self.__events Maybe this is better (untested): def get_events(self, wait=False): """ Get a list of available QMP events. @param wait: block until an event is available (bool) """ if not wait: self.__sock.setblocking(0) try: self.__json_read(only_event=wait) except socket.error, err: if err[0] == errno.EAGAIN: # No data available pass if not wait: self.__sock.setblocking(1) return self.__events > > def clear_events(self):