summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKhem Raj <raj.khem@gmail.com>2025-07-26 15:31:50 -0700
committerRichard Purdie <richard.purdie@linuxfoundation.org>2025-07-28 17:37:02 +0100
commit3475f39be4e60389d8cd81bda9e03c27cc6e956c (patch)
treea756cee415a4b9a46a6c2f0f833994eb7fa559ee
parent13d6d57e43318b1cc03f5d9148613e054397388b (diff)
downloadpoky-3475f39be4e60389d8cd81bda9e03c27cc6e956c.tar.gz
qemu: Remove deprecated asyncio calls in qmp python module
Fixes deprecation warning seen with python 3.13 DEBUG: QMP Initializing to /mnt/b/yoe/master/build/tmp/.sv4_k_q4 recipe-sysroot-native/usr/lib/qemu-python/qmp/legacy.py:89: DeprecationWarning: There is no current event loop self._aloop = asyncio.get_event_loop() (From OE-Core rev: 249e42a02c412454cfed9d58e27a054dfa5d2b06) Signed-off-by: Khem Raj <raj.khem@gmail.com> Signed-off-by: Mathieu Dubois-Briand <mathieu.dubois-briand@bootlin.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/recipes-devtools/qemu/qemu.inc1
-rw-r--r--meta/recipes-devtools/qemu/qemu/0012-Remove-deprecated-get_event_loop-calls.patch85
2 files changed, 86 insertions, 0 deletions
diff --git a/meta/recipes-devtools/qemu/qemu.inc b/meta/recipes-devtools/qemu/qemu.inc
index 7893df0df2..2ee76e9a7c 100644
--- a/meta/recipes-devtools/qemu/qemu.inc
+++ b/meta/recipes-devtools/qemu/qemu.inc
@@ -31,6 +31,7 @@ SRC_URI = "https://download.qemu.org/${BPN}-${PV}.tar.xz \
31 file://0008-Define-MAP_SYNC-and-MAP_SHARED_VALIDATE-on-needed-li.patch \ 31 file://0008-Define-MAP_SYNC-and-MAP_SHARED_VALIDATE-on-needed-li.patch \
32 file://0010-configure-lookup-meson-exutable-from-PATH.patch \ 32 file://0010-configure-lookup-meson-exutable-from-PATH.patch \
33 file://0011-qemu-Ensure-pip-and-the-python-venv-aren-t-used-for-.patch \ 33 file://0011-qemu-Ensure-pip-and-the-python-venv-aren-t-used-for-.patch \
34 file://0012-Remove-deprecated-get_event_loop-calls.patch \
34 file://qemu-guest-agent.init \ 35 file://qemu-guest-agent.init \
35 file://qemu-guest-agent.udev \ 36 file://qemu-guest-agent.udev \
36 " 37 "
diff --git a/meta/recipes-devtools/qemu/qemu/0012-Remove-deprecated-get_event_loop-calls.patch b/meta/recipes-devtools/qemu/qemu/0012-Remove-deprecated-get_event_loop-calls.patch
new file mode 100644
index 0000000000..64816fe7d9
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu/0012-Remove-deprecated-get_event_loop-calls.patch
@@ -0,0 +1,85 @@
1From 5240406747fd43886618ae8194153e6fc957a82a Mon Sep 17 00:00:00 2001
2From: John Snow <jsnow@redhat.com>
3Date: Tue, 13 Aug 2024 09:35:30 -0400
4Subject: [PATCH] Remove deprecated get_event_loop calls
5
6This method was deprecated in 3.12 because it ordinarily should not be
7used from coroutines; if there is not a currently running event loop,
8this automatically creates a new event loop - which is usually not what
9you want from code that would ever run in the bottom half.
10
11In our case, we do want this behavior in two places:
12
13(1) The synchronous shim, for convenience: this allows fully sync
14programs to use QEMUMonitorProtocol() without needing to set up an event
15loop beforehand. This is intentional to fully box in the async
16complexities into the legacy sync shim.
17
18(2) The qmp_tui shell; instead of relying on asyncio.run to create and
19run an asyncio program, we need to be able to pass the current asyncio
20loop to urwid setup functions. For convenience, again, we create one if
21one is not present to simplify the creation of the TUI appliance.
22
23The remaining user of get_event_loop() was in fact one of the erroneous
24users that should not have been using this function: if there's no
25running event loop inside of a coroutine, you're in big trouble :)
26
27Upstream-Status: Backport [https://gitlab.com/qemu-project/python-qemu-qmp/-/merge_requests/33]
28Signed-off-by: John Snow <jsnow@redhat.com>
29---
30 python/qemu/qmp/legacy.py | 9 ++++++++-
31 python/qemu/qmp/qmp_tui.py | 7 ++++++-
32 python/tests/protocol.py | 2 +-
33 3 files changed, 15 insertions(+), 3 deletions(-)
34
35diff --git a/python/qemu/qmp/legacy.py b/python/qemu/qmp/legacy.py
36index 22a2b56..ea9b803 100644
37--- a/python/qemu/qmp/legacy.py
38+++ b/python/qemu/qmp/legacy.py
39@@ -86,7 +86,14 @@ def __init__(self,
40 "server argument should be False when passing a socket")
41
42 self._qmp = QMPClient(nickname)
43- self._aloop = asyncio.get_event_loop()
44+
45+ try:
46+ self._aloop = asyncio.get_running_loop()
47+ except RuntimeError:
48+ # No running loop; since this is a sync shim likely to be
49+ # used in fully sync programs, create one if neccessary.
50+ self._aloop = asyncio.get_event_loop_policy().get_event_loop()
51+
52 self._address = address
53 self._timeout: Optional[float] = None
54
55diff --git a/python/qemu/qmp/qmp_tui.py b/python/qemu/qmp/qmp_tui.py
56index 2d9ebbd..d11b9fc 100644
57--- a/python/qemu/qmp/qmp_tui.py
58+++ b/python/qemu/qmp/qmp_tui.py
59@@ -377,7 +377,12 @@ def run(self, debug: bool = False) -> None:
60 screen = urwid.raw_display.Screen()
61 screen.set_terminal_properties(256)
62
63- self.aloop = asyncio.get_event_loop()
64+ try:
65+ self.aloop = asyncio.get_running_loop()
66+ except RuntimeError:
67+ # No running asyncio event loop. Create one if necessary.
68+ self.aloop = asyncio.get_event_loop_policy().get_event_loop()
69+
70 self.aloop.set_debug(debug)
71
72 # Gracefully handle SIGTERM and SIGINT signals
73diff --git a/python/tests/protocol.py b/python/tests/protocol.py
74index 56c4d44..8dcef57 100644
75--- a/python/tests/protocol.py
76+++ b/python/tests/protocol.py
77@@ -228,7 +228,7 @@ def async_test(async_test_method):
78 Decorator; adds SetUp and TearDown to async tests.
79 """
80 async def _wrapper(self, *args, **kwargs):
81- loop = asyncio.get_event_loop()
82+ loop = asyncio.get_running_loop()
83 loop.set_debug(True)
84
85 await self._asyncSetUp()