mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
gh-128002: use per threads tasks linked list in asyncio (#128869)
Co-authored-by: Łukasz Langa <lukasz@langa.pl>
This commit is contained in:
parent
b4ff8b22b3
commit
0d68b14a0d
7 changed files with 156 additions and 58 deletions
|
@ -643,6 +643,8 @@ init_interpreter(PyInterpreterState *interp,
|
|||
_Py_brc_init_state(interp);
|
||||
#endif
|
||||
llist_init(&interp->mem_free_queue.head);
|
||||
llist_init(&interp->asyncio_tasks_head);
|
||||
interp->asyncio_tasks_lock = (PyMutex){0};
|
||||
for (int i = 0; i < _PY_MONITORING_UNGROUPED_EVENTS; i++) {
|
||||
interp->monitors.tools[i] = 0;
|
||||
}
|
||||
|
@ -1512,7 +1514,7 @@ init_threadstate(_PyThreadStateImpl *_tstate,
|
|||
tstate->delete_later = NULL;
|
||||
|
||||
llist_init(&_tstate->mem_free_queue);
|
||||
|
||||
llist_init(&_tstate->asyncio_tasks_head);
|
||||
if (interp->stoptheworld.requested || _PyRuntime.stoptheworld.requested) {
|
||||
// Start in the suspended state if there is an ongoing stop-the-world.
|
||||
tstate->state = _Py_THREAD_SUSPENDED;
|
||||
|
@ -1692,6 +1694,14 @@ PyThreadState_Clear(PyThreadState *tstate)
|
|||
Py_CLEAR(((_PyThreadStateImpl *)tstate)->asyncio_running_loop);
|
||||
Py_CLEAR(((_PyThreadStateImpl *)tstate)->asyncio_running_task);
|
||||
|
||||
|
||||
PyMutex_Lock(&tstate->interp->asyncio_tasks_lock);
|
||||
// merge any lingering tasks from thread state to interpreter's
|
||||
// tasks list
|
||||
llist_concat(&tstate->interp->asyncio_tasks_head,
|
||||
&((_PyThreadStateImpl *)tstate)->asyncio_tasks_head);
|
||||
PyMutex_Unlock(&tstate->interp->asyncio_tasks_lock);
|
||||
|
||||
Py_CLEAR(tstate->dict);
|
||||
Py_CLEAR(tstate->async_exc);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue