]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-41247: asyncio.set_running_loop() cache running loop holder (GH-21401)
authorTony Solomonik <tony.solomonik@gmail.com>
Wed, 8 Jul 2020 19:27:31 +0000 (22:27 +0300)
committerGitHub <noreply@github.com>
Wed, 8 Jul 2020 19:27:31 +0000 (12:27 -0700)
The running loop holder cache variable was always set to NULL when
calling set_running_loop.

Now set_running_loop saves the newly created running loop holder in the
cache variable for faster access in get_running_loop.

Automerge-Triggered-By: @1st1
Misc/NEWS.d/next/Core and Builtins/2020-07-08-22-03-54.bpo-41247.PndYIk.rst [new file with mode: 0644]
Modules/_asynciomodule.c

diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-07-08-22-03-54.bpo-41247.PndYIk.rst b/Misc/NEWS.d/next/Core and Builtins/2020-07-08-22-03-54.bpo-41247.PndYIk.rst
new file mode 100644 (file)
index 0000000..08699b6
--- /dev/null
@@ -0,0 +1,2 @@
+Always cache the running loop holder when running
+``asyncio.set_running_loop``.
index b378742648b2a2b50c754880c592024877ee6f0f..4a1c91e9eddd67fe46600ea62a7cb907301d298c 100644 (file)
@@ -291,10 +291,13 @@ error:
 static int
 set_running_loop(PyObject *loop)
 {
-    cached_running_holder = NULL;
-    cached_running_holder_tsid = 0;
+    PyObject *ts_dict = NULL;
+
+    PyThreadState *tstate = PyThreadState_Get();
+    if (tstate != NULL) {
+        ts_dict = _PyThreadState_GetDict(tstate);  // borrowed
+    }
 
-    PyObject *ts_dict = PyThreadState_GetDict();  // borrowed
     if (ts_dict == NULL) {
         PyErr_SetString(
             PyExc_RuntimeError, "thread-local storage is not available");
@@ -314,6 +317,9 @@ set_running_loop(PyObject *loop)
     }
     Py_DECREF(rl);
 
+    cached_running_holder = (PyObject *)rl;
+    cached_running_holder_tsid = PyThreadState_GetID(tstate);
+
     return 0;
 }