[Python-checkins] bpo-41247: asyncio.set_running_loop() cache running loop holder (GH-21401)
Tony Solomonik
webhook-mailer at python.org
Wed Jul 8 15:27:40 EDT 2020
https://github.com/python/cpython/commit/529f42645d38b6b0075f256814dfb3d220ac7d92
commit: 529f42645d38b6b0075f256814dfb3d220ac7d92
branch: master
author: Tony Solomonik <tony.solomonik at gmail.com>
committer: GitHub <noreply at github.com>
date: 2020年07月08日T12:27:31-07:00
summary:
bpo-41247: asyncio.set_running_loop() cache running loop holder (GH-21401)
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
files:
A Misc/NEWS.d/next/Core and Builtins/2020-07-08-22-03-54.bpo-41247.PndYIk.rst
M 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
index 0000000000000..08699b6e4a1f0
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2020-07-08-22-03-54.bpo-41247.PndYIk.rst
@@ -0,0 +1,2 @@
+Always cache the running loop holder when running
+``asyncio.set_running_loop``.
diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c
index b378742648b2a..4a1c91e9eddd6 100644
--- a/Modules/_asynciomodule.c
+++ b/Modules/_asynciomodule.c
@@ -291,10 +291,13 @@ get_running_loop(PyObject **loop)
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;
}
More information about the Python-checkins
mailing list