https://github.com/python/cpython/commit/47847aa8ef66837f984fc4e30187d88f8d8ab201
commit: 47847aa8ef66837f984fc4e30187d88f8d8ab201
branch: main
author: Sam Gross <[email protected]>
committer: kumaraditya303 <[email protected]>
date: 2024-07-23T14:17:14+05:30
summary:
gh-120974: Make _asyncio._enter_task atomic in the free-threaded build (#122138)
Use `PyDict_SetDefaultRef` to set the current task in a single operation
under the dictionary's lock.
files:
M Modules/_asynciomodule.c
diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c
index 372f19794be0dd..dd64b233e90e60 100644
--- a/Modules/_asynciomodule.c
+++ b/Modules/_asynciomodule.c
@@ -2009,14 +2009,11 @@ static int
enter_task(asyncio_state *state, PyObject *loop, PyObject *task)
{
PyObject *item;
- Py_hash_t hash;
- hash = PyObject_Hash(loop);
- if (hash == -1) {
+ int res = PyDict_SetDefaultRef(state->current_tasks, loop, task, &item);
+ if (res < 0) {
return -1;
}
- item = _PyDict_GetItem_KnownHash(state->current_tasks, loop, hash);
- if (item != NULL) {
- Py_INCREF(item);
+ else if (res == 1) {
PyErr_Format(
PyExc_RuntimeError,
"Cannot enter into task %R while another " \
@@ -2025,10 +2022,8 @@ enter_task(asyncio_state *state, PyObject *loop,
PyObject *task)
Py_DECREF(item);
return -1;
}
- if (PyErr_Occurred()) {
- return -1;
- }
- return _PyDict_SetItem_KnownHash(state->current_tasks, loop, task, hash);
+ Py_DECREF(item);
+ return 0;
}
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]