python/aqmp: Return cleared events from EventListener.clear()

This serves two purposes:

(1) It is now possible to discern whether or not clear() removed any
event(s) from the queue with absolute certainty, and

(2) It is now very easy to get a List of all pending events in one
chunk, which is useful for the sync bridge.

Signed-off-by: John Snow <jsnow@redhat.com>
Reviewed-by: Hanna Reitz <hreitz@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Message-id: 20210923004938.3999963-4-jsnow@redhat.com
Signed-off-by: John Snow <jsnow@redhat.com>
This commit is contained in:
John Snow 2021-09-22 20:49:24 -04:00
parent 16cce725ed
commit 6bfebc7306

View file

@ -562,7 +562,7 @@ class EventListener:
""" """
return self._queue.empty() return self._queue.empty()
def clear(self) -> None: def clear(self) -> List[Message]:
""" """
Clear this listener of all pending events. Clear this listener of all pending events.
@ -570,17 +570,22 @@ class EventListener:
pending FIFO queue synchronously. It can be also be used to pending FIFO queue synchronously. It can be also be used to
manually clear any pending events, if desired. manually clear any pending events, if desired.
:return: The cleared events, if any.
.. warning:: .. warning::
Take care when discarding events. Cleared events will be Take care when discarding events. Cleared events will be
silently tossed on the floor. All events that were ever silently tossed on the floor. All events that were ever
accepted by this listener are visible in `history()`. accepted by this listener are visible in `history()`.
""" """
events = []
while True: while True:
try: try:
self._queue.get_nowait() events.append(self._queue.get_nowait())
except asyncio.QueueEmpty: except asyncio.QueueEmpty:
break break
return events
def __aiter__(self) -> AsyncIterator[Message]: def __aiter__(self) -> AsyncIterator[Message]:
return self return self