[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 1/2] QMP: add get_events(wait=True) option
From: |
Luiz Capitulino |
Subject: |
Re: [Qemu-devel] [PATCH 1/2] QMP: add get_events(wait=True) option |
Date: |
Wed, 25 May 2011 18:15:22 -0300 |
On Wed, 25 May 2011 19:48:00 +0100
Stefan Hajnoczi <address@hidden> 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 <address@hidden>
> ---
> 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):