Skip to content

Commit fd1b9cd

Browse files
more asserts
1 parent eeb0273 commit fd1b9cd

File tree

1 file changed

+42
-7
lines changed

1 file changed

+42
-7
lines changed

Modules/_asynciomodule.c

Lines changed: 42 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1666,7 +1666,7 @@ FutureIter_dealloc(futureiterobject *it)
16661666
}
16671667

16681668
static 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+
17061719
static PyObject *
17071720
FutureIter_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

19291946
static int
@@ -2909,6 +2926,8 @@ gen_status_from_result(PyObject **result)
29092926
static PyObject *
29102927
task_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

33533374
static 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

Comments
 (0)