From 8d4f9a3f9372ac946c80c49c4aa34fe40d23c984 Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Mon, 10 Feb 2025 08:51:58 +0000 Subject: [PATCH 1/3] add fastpath --- Modules/_asynciomodule.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index 656c03a98d73b2..7511450247f4cc 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -3991,6 +3991,17 @@ static inline int add_one_task(asyncio_state *state, PyObject *tasks, PyObject *task, PyObject *loop) { assert(PySet_CheckExact(tasks)); + if (Task_CheckExact(state, task)) { + TaskObj *op = (TaskObj *)task; + if (op->task_state == STATE_PENDING && op->task_loop == loop) + { + if (PySet_Add(tasks, task) < 0) { + return -1; + } + } + return 0; + } + PyObject *done = PyObject_CallMethodNoArgs(task, &_Py_ID(done)); if (done == NULL) { return -1; From d68fceb9b9af7c30ad616f6b8524f4ee44c0c3f3 Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Mon, 10 Feb 2025 09:00:10 +0000 Subject: [PATCH 2/3] add critical section --- Modules/_asynciomodule.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index 7511450247f4cc..8c0391eb4a71e4 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -3992,8 +3992,11 @@ add_one_task(asyncio_state *state, PyObject *tasks, PyObject *task, PyObject *lo { assert(PySet_CheckExact(tasks)); if (Task_CheckExact(state, task)) { - TaskObj *op = (TaskObj *)task; - if (op->task_state == STATE_PENDING && op->task_loop == loop) + int pending = 0; + Py_BEGIN_CRITICAL_SECTION(task); + pending = ((TaskObj *)task)->task_state == STATE_PENDING && ((TaskObj *)task)->task_loop == loop; + Py_END_CRITICAL_SECTION(); + if (pending) { if (PySet_Add(tasks, task) < 0) { return -1; From 0cdbbe470e8d667b42284e1e2b76e27ee3023201 Mon Sep 17 00:00:00 2001 From: Kumar Aditya Date: Mon, 10 Feb 2025 09:00:46 +0000 Subject: [PATCH 3/3] fmt --- Modules/_asynciomodule.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index 8c0391eb4a71e4..f7667c92ee13fc 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -3996,8 +3996,7 @@ add_one_task(asyncio_state *state, PyObject *tasks, PyObject *task, PyObject *lo Py_BEGIN_CRITICAL_SECTION(task); pending = ((TaskObj *)task)->task_state == STATE_PENDING && ((TaskObj *)task)->task_loop == loop; Py_END_CRITICAL_SECTION(); - if (pending) - { + if (pending) { if (PySet_Add(tasks, task) < 0) { return -1; }