commit: ee17cbd807ba976491e4c657be8aa9b9a29fe059
Author: Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Sat Aug 31 19:06:25 2024 +0000
Commit: Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Sat Aug 31 19:06:25 2024 +0000
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=ee17cbd8
_safe_loop: Discard wrapped asyncio.run loop that was closed
Since commit cb0c09d8cecb, _get_running_loop can wrap loops from
asyncio.run, so these loops need to be discarded if they've been
closed.
Fixes: cb0c09d8cecb ("Support coroutine exitfuncs for non-main loops")
Bug: https://bugs.gentoo.org/938761
Bug: https://bugs.gentoo.org/761538
Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>
lib/portage/util/futures/_asyncio/__init__.py | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/lib/portage/util/futures/_asyncio/__init__.py
b/lib/portage/util/futures/_asyncio/__init__.py
index bdacda59ce..23c664e763 100644
--- a/lib/portage/util/futures/_asyncio/__init__.py
+++ b/lib/portage/util/futures/_asyncio/__init__.py
@@ -311,6 +311,13 @@ def _safe_loop(create: Optional[bool] = True) ->
Optional[_AsyncioEventLoop]:
_thread_weakrefs.loops = weakref.WeakValueDictionary()
try:
loop = _thread_weakrefs.loops[thread_key]
+ if loop.is_closed():
+ # Discard wrapped asyncio.run loop that was closed.
+ del _thread_weakrefs.loops[thread_key]
+ if loop is _thread_weakrefs.mainloop:
+ _thread_weakrefs.mainloop = None
+ loop = None
+ raise KeyError(thread_key)
except KeyError:
if not create:
return None