mirror of https://github.com/python/cpython
[3.13] gh-121621: Use PyMutex for writes to asyncio state (GH-121622) (#121774)
(cherry picked from commit 5d6861ad06
)
Co-authored-by: Ken Jin <kenjin@python.org>
Co-authored-by: Kumar Aditya <kumaraditya@python.org>
This commit is contained in:
parent
55ff124b9c
commit
a2a4f5ebc5
|
@ -293,6 +293,8 @@ get_running_loop(asyncio_state *state, PyObject **loop)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO GH-121621: This should be moved to PyThreadState
|
||||||
|
// for easier and quicker access.
|
||||||
state->cached_running_loop = rl;
|
state->cached_running_loop = rl;
|
||||||
state->cached_running_loop_tsid = ts_id;
|
state->cached_running_loop_tsid = ts_id;
|
||||||
}
|
}
|
||||||
|
@ -336,6 +338,9 @@ set_running_loop(asyncio_state *state, PyObject *loop)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// TODO GH-121621: This should be moved to PyThreadState
|
||||||
|
// for easier and quicker access.
|
||||||
state->cached_running_loop = loop; // borrowed, kept alive by ts_dict
|
state->cached_running_loop = loop; // borrowed, kept alive by ts_dict
|
||||||
state->cached_running_loop_tsid = PyThreadState_GetID(tstate);
|
state->cached_running_loop_tsid = PyThreadState_GetID(tstate);
|
||||||
|
|
||||||
|
@ -1616,6 +1621,7 @@ FutureIter_dealloc(futureiterobject *it)
|
||||||
state = get_asyncio_state(module);
|
state = get_asyncio_state(module);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO GH-121621: This should be moved to thread state as well.
|
||||||
if (state && state->fi_freelist_len < FI_FREELIST_MAXLEN) {
|
if (state && state->fi_freelist_len < FI_FREELIST_MAXLEN) {
|
||||||
state->fi_freelist_len++;
|
state->fi_freelist_len++;
|
||||||
it->future = (FutureObj*) state->fi_freelist;
|
it->future = (FutureObj*) state->fi_freelist;
|
||||||
|
@ -2146,7 +2152,12 @@ _asyncio_Task___init___impl(TaskObj *self, PyObject *coro, PyObject *loop,
|
||||||
// optimization: defer task name formatting
|
// optimization: defer task name formatting
|
||||||
// store the task counter as PyLong in the name
|
// store the task counter as PyLong in the name
|
||||||
// for deferred formatting in get_name
|
// for deferred formatting in get_name
|
||||||
name = PyLong_FromUnsignedLongLong(++state->task_name_counter);
|
#ifdef Py_GIL_DISABLED
|
||||||
|
unsigned long long counter = _Py_atomic_add_uint64(&state->task_name_counter, 1) + 1;
|
||||||
|
#else
|
||||||
|
unsigned long long counter = ++state->task_name_counter;
|
||||||
|
#endif
|
||||||
|
name = PyLong_FromUnsignedLongLong(counter);
|
||||||
} else if (!PyUnicode_CheckExact(name)) {
|
} else if (!PyUnicode_CheckExact(name)) {
|
||||||
name = PyObject_Str(name);
|
name = PyObject_Str(name);
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue