From c7a9d06e063c2e4ab3876b29fa4a211cc3e9cfc3 Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Thu, 13 Feb 2025 13:19:53 +0530 Subject: gh-128002: optimistically remove tasks from linked list when finished (#129995) --- Modules/_asynciomodule.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index 5a4e656..ff24fd7 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -413,12 +413,22 @@ future_ensure_alive(FutureObj *fut) } \ } while(0); +static void unregister_task(asyncio_state *state, TaskObj *task); static int future_schedule_callbacks(asyncio_state *state, FutureObj *fut) { _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(fut); + assert(fut->fut_state != STATE_PENDING); + + if (Task_Check(state, fut)) { + // remove task from linked-list of tasks + // as it is finished now + TaskObj *task = (TaskObj *)fut; + unregister_task(state, task); + } + if (fut->fut_callback0 != NULL) { /* There's a 1st callback */ @@ -4030,6 +4040,7 @@ add_tasks_llist(struct llist_node *head, PyListObject *tasks) struct llist_node *node; llist_for_each_safe(node, head) { TaskObj *task = llist_data(node, TaskObj, task_node); + assert(task->task_state == STATE_PENDING); // The linked list holds borrowed references to task // as such it is possible that the task is concurrently // deallocated while added to this list. -- cgit v0.12