@@ -1666,7 +1666,7 @@ FutureIter_dealloc(futureiterobject *it)
16661666}
16671667
16681668static  PySendResult 
1669- FutureIter_am_send (futureiterobject  * it ,
1669+ FutureIter_am_send_lock_held (futureiterobject  * it ,
16701670                   PyObject  * Py_UNUSED (arg ),
16711671                   PyObject  * * result )
16721672{
@@ -1703,6 +1703,19 @@ FutureIter_am_send(futureiterobject *it,
17031703    return  PYGEN_ERROR ;
17041704}
17051705
1706+ static  PySendResult 
1707+ FutureIter_am_send (futureiterobject  * it ,
1708+                    PyObject  * Py_UNUSED (arg ),
1709+                    PyObject  * * result )
1710+ {
1711+     PySendResult  res ;
1712+     Py_BEGIN_CRITICAL_SECTION2 (it , it -> future );
1713+     res  =  FutureIter_am_send_lock_held (it , Py_None , result );
1714+     Py_END_CRITICAL_SECTION2 ();
1715+     return  res ;
1716+ }
1717+ 
1718+ 
17061719static  PyObject  * 
17071720FutureIter_iternext (futureiterobject  * it )
17081721{
@@ -1923,7 +1936,11 @@ TaskStepMethWrapper_call(TaskStepMethWrapper *o,
19231936        return  NULL ;
19241937    }
19251938    asyncio_state  * state  =  get_asyncio_state_by_def ((PyObject  * )o );
1926-     return  task_step (state , o -> sw_task , o -> sw_arg );
1939+     PyObject  * res ;
1940+     Py_BEGIN_CRITICAL_SECTION (o -> sw_task );
1941+     res  =  task_step (state , o -> sw_task , o -> sw_arg );
1942+     Py_END_CRITICAL_SECTION ();
1943+     return  res ;
19271944}
19281945
19291946static  int 
@@ -2909,6 +2926,8 @@ gen_status_from_result(PyObject **result)
29092926static  PyObject  * 
29102927task_step_impl (asyncio_state  * state , TaskObj  * task , PyObject  * exc )
29112928{
2929+     _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED (task );
2930+ 
29122931    int  clear_exc  =  0 ;
29132932    PyObject  * result  =  NULL ;
29142933    PyObject  * coro ;
@@ -3068,8 +3087,10 @@ task_step_handle_result_impl(asyncio_state *state, TaskObj *task, PyObject *resu
30683087        if  (wrapper  ==  NULL ) {
30693088            goto fail ;
30703089        }
3090+         Py_BEGIN_CRITICAL_SECTION (result );
30713091        tmp  =  future_add_done_callback (state ,
30723092            (FutureObj * )result , wrapper , task -> task_context );
3093+         Py_END_CRITICAL_SECTION ();
30733094        Py_DECREF (wrapper );
30743095        if  (tmp  ==  NULL ) {
30753096            goto fail ;
@@ -3270,9 +3291,9 @@ task_step(asyncio_state *state, TaskObj *task, PyObject *exc)
32703291    if  (enter_task (state , task -> task_loop , (PyObject * )task ) <  0 ) {
32713292        return  NULL ;
32723293    }
3273-      Py_BEGIN_CRITICAL_SECTION ( task ); 
3294+ 
32743295    res  =  task_step_impl (state , task , exc );
3275-      Py_END_CRITICAL_SECTION (); 
3296+ 
32763297    if  (res  ==  NULL ) {
32773298        PyObject  * exc  =  PyErr_GetRaisedException ();
32783299        leave_task (state , task -> task_loop , (PyObject * )task );
@@ -3351,16 +3372,20 @@ task_eager_start(asyncio_state *state, TaskObj *task)
33513372}
33523373
33533374static  PyObject  * 
3354- task_wakeup (TaskObj  * task , PyObject  * o )
3375+ task_wakeup_lock_held (TaskObj  * task , PyObject  * o )
33553376{
3377+     _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED (task );
3378+ 
33563379    PyObject  * result ;
33573380    assert (o );
33583381
33593382    asyncio_state  * state  =  get_asyncio_state_by_def ((PyObject  * )task );
33603383    if  (Future_CheckExact (state , o ) ||  Task_CheckExact (state , o )) {
33613384        PyObject  * fut_result  =  NULL ;
3362-         int  res  =  future_get_result (state , (FutureObj * )o , & fut_result );
3363- 
3385+         int  res ;
3386+         Py_BEGIN_CRITICAL_SECTION (o );
3387+         res  =  future_get_result (state , (FutureObj * )o , & fut_result );
3388+         Py_END_CRITICAL_SECTION ();
33643389        switch (res ) {
33653390        case  -1 :
33663391            assert (fut_result  ==  NULL );
@@ -3394,6 +3419,16 @@ task_wakeup(TaskObj *task, PyObject *o)
33943419    return  result ;
33953420}
33963421
3422+ static  PyObject  * 
3423+ task_wakeup (TaskObj  * task , PyObject  * o )
3424+ {
3425+     PyObject  * res ;
3426+     Py_BEGIN_CRITICAL_SECTION (task );
3427+     res  =  task_wakeup_lock_held (task , o );
3428+     Py_END_CRITICAL_SECTION ();
3429+     return  res ;
3430+ }
3431+ 
33973432
33983433/*********************** Functions **************************/ 
33993434
0 commit comments