From: John Snow <jsnow@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Hanna Reitz" <hreitz@redhat.com>,
"Cleber Rosa" <crosa@redhat.com>, "John Snow" <jsnow@redhat.com>,
qemu-block@nongnu.org, "Daniel Berrangé" <berrange@redhat.com>,
"Kevin Wolf" <kwolf@redhat.com>
Subject: [PATCH 11/19] python: backport 'Remove deprecated get_event_loop calls'
Date: Mon, 1 Sep 2025 16:26:53 -0400 [thread overview]
Message-ID: <20250901202702.2971212-12-jsnow@redhat.com> (raw)
In-Reply-To: <20250901202702.2971212-1-jsnow@redhat.com>
This method was deprecated in 3.12 because it ordinarily should not be
used from coroutines; if there is not a currently running event loop,
this automatically creates a new event loop - which is usually not what
you want from code that would ever run in the bottom half.
In our case, we do want this behavior in two places:
(1) The synchronous shim, for convenience: this allows fully sync
programs to use QEMUMonitorProtocol() without needing to set up an event
loop beforehand. This is intentional to fully box in the async
complexities into the legacy sync shim.
(2) The qmp_tui shell; instead of relying on asyncio.run to create and
run an asyncio program, we need to be able to pass the current asyncio
loop to urwid setup functions. For convenience, again, we create one if
one is not present to simplify the creation of the TUI appliance.
The remaining user of get_event_loop() was in fact one of the erroneous
users that should not have been using this function: if there's no
running event loop inside of a coroutine, you're in big trouble :)
Signed-off-by: John Snow <jsnow@redhat.com>
cherry picked from commit aa1ff9907603a3033296027e1bd021133df86ef1
Signed-off-by: John Snow <jsnow@redhat.com>
---
python/qemu/qmp/legacy.py | 9 ++++++++-
python/qemu/qmp/qmp_tui.py | 7 ++++++-
python/tests/protocol.py | 2 +-
3 files changed, 15 insertions(+), 3 deletions(-)
diff --git a/python/qemu/qmp/legacy.py b/python/qemu/qmp/legacy.py
index c8d0a29b56f..735d42971e9 100644
--- a/python/qemu/qmp/legacy.py
+++ b/python/qemu/qmp/legacy.py
@@ -86,7 +86,14 @@ def __init__(self,
"server argument should be False when passing a socket")
self._qmp = QMPClient(nickname)
- self._aloop = asyncio.get_event_loop()
+
+ try:
+ self._aloop = asyncio.get_running_loop()
+ except RuntimeError:
+ # No running loop; since this is a sync shim likely to be
+ # used in fully sync programs, create one if neccessary.
+ self._aloop = asyncio.get_event_loop_policy().get_event_loop()
+
self._address = address
self._timeout: Optional[float] = None
diff --git a/python/qemu/qmp/qmp_tui.py b/python/qemu/qmp/qmp_tui.py
index 53ea6c59a71..12bdc17c99e 100644
--- a/python/qemu/qmp/qmp_tui.py
+++ b/python/qemu/qmp/qmp_tui.py
@@ -388,7 +388,12 @@ def run(self, debug: bool = False) -> None:
screen = urwid.raw_display.Screen()
screen.set_terminal_properties(256)
- self.aloop = asyncio.get_event_loop()
+ try:
+ self.aloop = asyncio.get_running_loop()
+ except RuntimeError:
+ # No running asyncio event loop. Create one if necessary.
+ self.aloop = asyncio.get_event_loop_policy().get_event_loop()
+
self.aloop.set_debug(debug)
# Gracefully handle SIGTERM and SIGINT signals
diff --git a/python/tests/protocol.py b/python/tests/protocol.py
index c254c77b176..e565802516d 100644
--- a/python/tests/protocol.py
+++ b/python/tests/protocol.py
@@ -227,7 +227,7 @@ def async_test(async_test_method):
Decorator; adds SetUp and TearDown to async tests.
"""
async def _wrapper(self, *args, **kwargs):
- loop = asyncio.get_event_loop()
+ loop = asyncio.get_running_loop()
loop.set_debug(True)
await self._asyncSetUp()
--
2.50.1
next prev parent reply other threads:[~2025-09-01 20:29 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-01 20:26 [PATCH 00/19] python: 3.14 compatibility and python-qemu-qmp synchronization John Snow
2025-09-01 20:26 ` [PATCH 01/19] python: backport 'Change error classes to have better repr methods' John Snow
2025-09-01 20:26 ` [PATCH 02/19] python: backport 'EventListener: add __repr__ method' John Snow
2025-09-01 20:26 ` [PATCH 03/19] python: backport 'kick event queue on legacy event_pull()' John Snow
2025-09-01 20:26 ` [PATCH 04/19] python: backport 'protocol: adjust logging name when changing client name' John Snow
2025-09-01 20:26 ` [PATCH 05/19] python: backport 'drop Python3.6 workarounds' John Snow
2025-09-01 20:26 ` [PATCH 06/19] python: backport 'qmp-shell: add common_parser()' John Snow
2025-09-01 20:26 ` [PATCH 07/19] python: backport 'feat: allow setting read buffer limit' John Snow
2025-09-01 20:26 ` [PATCH 08/19] python: backport 'make require() preserve async-ness' John Snow
2025-09-01 20:26 ` [PATCH 09/19] python: backport 'qmp-shell-wrap: handle missing binary gracefully' John Snow
2025-09-01 20:26 ` [PATCH 10/19] python: backport 'qmp-tui: Do not crash if optional dependencies are not met' John Snow
2025-09-01 20:26 ` John Snow [this message]
2025-09-01 20:26 ` [PATCH 12/19] python: backport '*really* remove get_event_loop' John Snow
2025-09-01 20:26 ` [PATCH 13/19] python: backport 'python: avoid creating additional event loops per thread' John Snow
2025-09-01 20:26 ` [PATCH 14/19] python: synchronize qemu.qmp documentation John Snow
2025-09-01 20:26 ` [PATCH 15/19] iotests: drop compat for old version context manager John Snow
2025-09-01 20:26 ` [PATCH 16/19] python: ensure QEMUQtestProtocol closes its socket John Snow
2025-09-01 20:26 ` [PATCH 17/19] iotests/147: ensure temporary sockets are closed before exiting John Snow
2025-09-01 20:27 ` [PATCH 18/19] iotests/151: ensure subprocesses are cleaned up John Snow
2025-09-01 20:27 ` [PATCH 19/19] iotests/check: always enable all python warnings John Snow
2025-09-02 16:54 ` [PATCH 00/19] python: 3.14 compatibility and python-qemu-qmp synchronization Daniel P. Berrangé
2025-09-02 16:58 ` John Snow
2025-09-02 19:34 ` Daniel P. Berrangé
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250901202702.2971212-12-jsnow@redhat.com \
--to=jsnow@redhat.com \
--cc=berrange@redhat.com \
--cc=crosa@redhat.com \
--cc=hreitz@redhat.com \
--cc=kwolf@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).