diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2020-07-08 19:47:20 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-08 19:47:20 (GMT) |
commit | fbd71f66843aea71c09656f17a196d29d5d484af (patch) | |
tree | 3490497a9dd6ff0cd93a8b81e9a66c12f0f1b4aa | |
parent | a0a6f1167834c87f12e2eca11dd77143103e7691 (diff) | |
download | cpython-fbd71f66843aea71c09656f17a196d29d5d484af.zip cpython-fbd71f66843aea71c09656f17a196d29d5d484af.tar.gz cpython-fbd71f66843aea71c09656f17a196d29d5d484af.tar.bz2 |
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
(cherry picked from commit 529f42645d38b6b0075f256814dfb3d220ac7d92)
Co-authored-by: Tony Solomonik <tony.solomonik@gmail.com>
-rw-r--r-- | Misc/NEWS.d/next/Core and Builtins/2020-07-08-22-03-54.bpo-41247.PndYIk.rst | 2 | ||||
-rw-r--r-- | Modules/_asynciomodule.c | 12 |
2 files changed, 11 insertions, 3 deletions
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 0000000..08699b6 --- /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 22eea3b..b615c48 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -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; } |