summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Snow2020-10-07 01:58:02 +0200
committerJohn Snow2020-10-20 15:37:57 +0200
commit1847a4a8c209379cd7f6788c0dcd5c17c2bf0907 (patch)
tree2afbbe734b5f5dd68399644e63d93a51357aac54
parentpython/machine.py: Don't modify state in _base_args() (diff)
downloadqemu-1847a4a8c209379cd7f6788c0dcd5c17c2bf0907.tar.gz
qemu-1847a4a8c209379cd7f6788c0dcd5c17c2bf0907.tar.xz
qemu-1847a4a8c209379cd7f6788c0dcd5c17c2bf0907.zip
python/machine.py: Handle None events in events_wait
If the timeout is 0, we can get None back. Handle this explicitly. Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Message-id: 20201006235817.3280413-6-jsnow@redhat.com Signed-off-by: John Snow <jsnow@redhat.com>
-rw-r--r--python/qemu/machine.py27
1 files changed, 20 insertions, 7 deletions
diff --git a/python/qemu/machine.py b/python/qemu/machine.py
index 812ca7d349..aebfa09e9d 100644
--- a/python/qemu/machine.py
+++ b/python/qemu/machine.py
@@ -28,7 +28,7 @@ from types import TracebackType
from typing import List, Optional, Type
from . import console_socket, qmp
-from .qmp import SocketAddrT
+from .qmp import QMPMessage, SocketAddrT
LOG = logging.getLogger(__name__)
@@ -604,13 +604,20 @@ class QEMUMachine:
def events_wait(self, events, timeout=60.0):
"""
- events_wait waits for and returns a named event
- from QMP with a timeout.
+ events_wait waits for and returns a single named event from QMP.
+ In the case of multiple qualifying events, this function returns the
+ first one.
- events: a sequence of (name, match_criteria) tuples.
- The match criteria are optional and may be None.
- See event_match for details.
- timeout: QEMUMonitorProtocol.pull_event timeout parameter.
+ :param events: A sequence of (name, match_criteria) tuples.
+ The match criteria are optional and may be None.
+ See event_match for details.
+ :param timeout: Optional timeout, in seconds.
+ See QEMUMonitorProtocol.pull_event.
+
+ :raise QMPTimeoutError: If timeout was non-zero and no matching events
+ were found.
+ :return: A QMP event matching the filter criteria.
+ If timeout was 0 and no event matched, None.
"""
def _match(event):
for name, match in events:
@@ -618,6 +625,8 @@ class QEMUMachine:
return True
return False
+ event: Optional[QMPMessage]
+
# Search cached events
for event in self._events:
if _match(event):
@@ -627,6 +636,10 @@ class QEMUMachine:
# Poll for new events
while True:
event = self._qmp.pull_event(wait=timeout)
+ if event is None:
+ # NB: None is only returned when timeout is false-ish.
+ # Timeouts raise QMPTimeoutError instead!
+ break
if _match(event):
return event
self._events.append(event)