On Tue, Jul 15, 2025 at 10:31 AM Daniel P. Berrangé <berrange@redhat.com> wrote:
>
> Our minimum python is now 3.9, so back compat with python
> 3.6 is no longer required.
>
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: John Snow <jsnow@redhat.com>
> ---
> python/qemu/qmp/protocol.py | 3 +--
> python/qemu/qmp/util.py | 29 -----------------------------
> 2 files changed, 1 insertion(+), 31 deletions(-)
>
> diff --git a/python/qemu/qmp/protocol.py b/python/qemu/qmp/protocol.py
> index 9a7ada4a1e..deb6b20d29 100644
> --- a/python/qemu/qmp/protocol.py
> +++ b/python/qemu/qmp/protocol.py
> @@ -41,7 +41,6 @@
> flush,
> pretty_traceback,
> upper_half,
> - wait_closed,
> )
>
>
> @@ -830,7 +829,7 @@ async def _bh_close_stream(self, error_pathway: bool = False) -> None:
>
> self.logger.debug("Waiting for StreamWriter to close ...")
> try:
> - await wait_closed(self._writer)
> + await self._writer.wait_closed()
> except Exception: # pylint: disable=broad-except
> # It's hard to tell if the Stream is already closed or
> # not. Even if one of the tasks has failed, it may have
> diff --git a/python/qemu/qmp/util.py b/python/qemu/qmp/util.py
> index 39fc341f2f..b5e9750576 100644
> --- a/python/qemu/qmp/util.py
> +++ b/python/qemu/qmp/util.py
> @@ -104,35 +104,6 @@ def create_task(coro: Coroutine[Any, Any, T],
> return asyncio.ensure_future(coro, loop=loop)
>
>
> -async def wait_closed(writer: asyncio.StreamWriter) -> None:
> - """
> - Python 3.6-compatible `asyncio.StreamWriter.wait_closed` wrapper.
> -
> - :param writer: The `asyncio.StreamWriter` to wait on.
> - """
> - if sys.version_info >= (3, 7):
> - await writer.wait_closed()
> - return
> -
> - # Python 3.6
> - transport = writer.transport
> - assert isinstance(transport, asyncio.WriteTransport)
> -
> - while not transport.is_closing():
> - await asyncio.sleep(0)
> -
> - # This is an ugly workaround, but it's the best I can come up with.
> - sock = transport.get_extra_info('socket')
> -
> - if sock is None:
> - # Our transport doesn't have a socket? ...
> - # Nothing we can reasonably do.
> - return
> -
> - while sock.fileno() != -1:
> - await asyncio.sleep(0)
> -
> -
> def asyncio_run(coro: Coroutine[Any, Any, T], *, debug: bool = False) -> T:
> """
> Python 3.6-compatible `asyncio.run` wrapper.
> --
> 2.49.0
>