]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-128002: optimistically remove tasks from linked list when finished (#129995)
authorKumar Aditya <kumaraditya@python.org>
Thu, 13 Feb 2025 07:49:53 +0000 (13:19 +0530)
committerGitHub <noreply@github.com>
Thu, 13 Feb 2025 07:49:53 +0000 (13:19 +0530)
Modules/_asynciomodule.c

index 5a4e65636e4b965ad9b997fdedf9c77f228cbf10..ff24fd76a617333b34d52b674fb15278410e4fbb 100644 (file)
@@ -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.