[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v2 10/16] python/machine.py: Handle None events in event_wait
From: |
John Snow |
Subject: |
Re: [PATCH v2 10/16] python/machine.py: Handle None events in event_wait |
Date: |
Thu, 4 Jun 2020 14:48:56 -0400 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.5.0 |
On 6/4/20 10:20 AM, Kevin Wolf wrote:
> Am 02.06.2020 um 23:45 hat John Snow geschrieben:
>> If the timeout is 0, we can get None back. Handle this explicitly.
>>
>> Signed-off-by: John Snow <jsnow@redhat.com>
>
> Subject line: This is events_wait(), not event_wait(). Both functions
> exist.
>
>> @@ -562,6 +564,8 @@ def _match(event):
>> # Poll for new events
>> while True:
>> event = self._qmp.pull_event(wait=timeout)
>> + if event is None:
>> + break
>> if _match(event):
>> return event
>> self._events.append(event)
>
> Hm... How could this ever work? I guess we just never really tested
> whether timeouts actually time out?
>
It's weirder than you think.
pull_event, when a timeout is supplied, will pass that timeout to
QEMUMonitorProtocol.__get_events, which populates the received event
queue but does not return data on the stack. If there are no events in
the queue and we are given a timeout, we will raise QMPTimeoutError if
no event appears in that timeframe.
pull_event() will only return None in the case that you don't give it a
timeout or tell it to wait.
The typing of events_wait allows us to specify a timeout of 0 here,
which is treated as no-wait down the stack, which may return None if
there was no such event ready.
Thus, break and also return None.
(I should update the docstring here.)
> (It's still somewhat unintuitive that receiving an unrelated event
> resets the timeout, but not the problem of this series...)
>
> Kevin
>
Yes, it's weird. It's not a timeout on this one event, it's a timeout on
event-receiving activity. In practice, it works quite well for the
iotest suite where there are often not other event drivers present. It
was a quick hack (that I introduced!) to ensure that iotests would halt
in some finite amount of time.
--js
- [PATCH v2 04/16] python/qmp.py: Do not return None from cmd_obj, (continued)
- [PATCH v2 04/16] python/qmp.py: Do not return None from cmd_obj, John Snow, 2020/06/02
- [PATCH v2 05/16] python/qmp.py: add casts to JSON deserialization, John Snow, 2020/06/02
- [PATCH v2 06/16] python/qmp.py: add QMPProtocolError, John Snow, 2020/06/02
- [PATCH v2 07/16] python/machine.py: Fix monitor address typing, John Snow, 2020/06/02
- [PATCH v2 09/16] python/machine.py: Don't modify state in _base_args(), John Snow, 2020/06/02
- [PATCH v2 08/16] python/machine.py: reorder __init__, John Snow, 2020/06/02
- [PATCH v2 10/16] python/machine.py: Handle None events in event_wait, John Snow, 2020/06/02
- [PATCH v2 12/16] python/machine.py: Add _qmp access shim, John Snow, 2020/06/02
- [PATCH v2 11/16] python/machine.py: use qmp.command, John Snow, 2020/06/02
- [PATCH v2 14/16] python/qemu: make 'args' style arguments immutable, John Snow, 2020/06/02
- [PATCH v2 13/16] python/machine.py: fix _popen access, John Snow, 2020/06/02
- [PATCH v2 15/16] iotests.py: Adjust HMP kwargs typing, John Snow, 2020/06/02
- [PATCH v2 16/16] python/qemu: Add mypy type annotations, John Snow, 2020/06/02
- Re: [PATCH v2 00/16] python: add mypy support to python/qemu, Eric Blake, 2020/06/02