mirror of https://gitee.com/openkylin/qemu.git
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>
This commit is contained in:
parent
652809dfa6
commit
1847a4a8c2
|
@ -28,7 +28,7 @@
|
||||||
from typing import List, Optional, Type
|
from typing import List, Optional, Type
|
||||||
|
|
||||||
from . import console_socket, qmp
|
from . import console_socket, qmp
|
||||||
from .qmp import SocketAddrT
|
from .qmp import QMPMessage, SocketAddrT
|
||||||
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
@ -604,13 +604,20 @@ def event_wait(self, name, timeout=60.0, match=None):
|
||||||
|
|
||||||
def events_wait(self, events, timeout=60.0):
|
def events_wait(self, events, timeout=60.0):
|
||||||
"""
|
"""
|
||||||
events_wait waits for and returns a named event
|
events_wait waits for and returns a single named event from QMP.
|
||||||
from QMP with a timeout.
|
In the case of multiple qualifying events, this function returns the
|
||||||
|
first one.
|
||||||
|
|
||||||
events: a sequence of (name, match_criteria) tuples.
|
:param events: A sequence of (name, match_criteria) tuples.
|
||||||
The match criteria are optional and may be None.
|
The match criteria are optional and may be None.
|
||||||
See event_match for details.
|
See event_match for details.
|
||||||
timeout: QEMUMonitorProtocol.pull_event timeout parameter.
|
: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):
|
def _match(event):
|
||||||
for name, match in events:
|
for name, match in events:
|
||||||
|
@ -618,6 +625,8 @@ def _match(event):
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
event: Optional[QMPMessage]
|
||||||
|
|
||||||
# Search cached events
|
# Search cached events
|
||||||
for event in self._events:
|
for event in self._events:
|
||||||
if _match(event):
|
if _match(event):
|
||||||
|
@ -627,6 +636,10 @@ def _match(event):
|
||||||
# Poll for new events
|
# Poll for new events
|
||||||
while True:
|
while True:
|
||||||
event = self._qmp.pull_event(wait=timeout)
|
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):
|
if _match(event):
|
||||||
return event
|
return event
|
||||||
self._events.append(event)
|
self._events.append(event)
|
||||||
|
|
Loading…
Reference in New Issue