Skip to content

Commit 4a5c568

Browse files
committed
add critical section held assertions
1 parent cb0345f commit 4a5c568

File tree

2 files changed

+14
-22
lines changed

2 files changed

+14
-22
lines changed

Lib/test/test_array.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1891,9 +1891,6 @@ def check(funcs, a=None, *args):
18911891
with threading_helper.start_threads(threads):
18921892
pass
18931893

1894-
for thread in threads:
1895-
threading_helper.join_thread(thread)
1896-
18971894
check([pop1] * 10)
18981895
check([pop1] + [subscr0] * 10)
18991896
check([append1] * 10)

Modules/arraymodule.c

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ enum machine_format_code {
147147
static int
148148
array_resize(arrayobject *self, Py_ssize_t newsize)
149149
{
150+
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(self);
150151
char *items;
151152
size_t _new_size;
152153

@@ -687,6 +688,7 @@ newarrayobject(PyTypeObject *type, Py_ssize_t size, const struct arraydescr *des
687688
static PyObject *
688689
getarrayitem(PyObject *op, Py_ssize_t i)
689690
{
691+
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(op);
690692
#ifndef NDEBUG
691693
array_state *state = find_array_state_by_type(Py_TYPE(op));
692694
assert(array_Check(op, state));
@@ -700,6 +702,7 @@ getarrayitem(PyObject *op, Py_ssize_t i)
700702
static int
701703
ins1(arrayobject *self, Py_ssize_t where, PyObject *v)
702704
{
705+
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(self);
703706
char *items;
704707
Py_ssize_t n = Py_SIZE(self);
705708
if (v == NULL) {
@@ -911,6 +914,7 @@ array_item(PyObject *op, Py_ssize_t i)
911914
static PyObject *
912915
array_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
913916
{
917+
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(a);
914918
array_state *state = find_array_state_by_type(Py_TYPE(a));
915919
arrayobject *np;
916920

@@ -1071,6 +1075,7 @@ array_repeat(PyObject *op, Py_ssize_t n)
10711075
static int
10721076
array_del_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
10731077
{
1078+
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(a);
10741079
char *item;
10751080
Py_ssize_t d; /* Change in size */
10761081
if (ilow < 0)
@@ -1104,7 +1109,7 @@ array_del_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
11041109
}
11051110

11061111
static int
1107-
array_ass_item_lock_held(PyObject *op, Py_ssize_t i, PyObject *v)
1112+
setarrayitem(PyObject *op, Py_ssize_t i, PyObject *v)
11081113
{
11091114
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(op);
11101115
arrayobject *a = arrayobject_CAST(op);
@@ -1123,24 +1128,16 @@ array_ass_item(PyObject *op, Py_ssize_t i, PyObject *v)
11231128
{
11241129
int ret;
11251130
Py_BEGIN_CRITICAL_SECTION(op);
1126-
ret = array_ass_item_lock_held(op, i, v);
1131+
ret = setarrayitem(op, i, v);
11271132
Py_END_CRITICAL_SECTION();
11281133
return ret;
11291134
}
11301135

1131-
static int
1132-
setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
1133-
{
1134-
#ifndef NDEBUG
1135-
array_state *state = find_array_state_by_type(Py_TYPE(a));
1136-
assert(array_Check(a, state));
1137-
#endif
1138-
return array_ass_item(a, i, v);
1139-
}
1140-
11411136
static int
11421137
array_iter_extend(arrayobject *self, PyObject *bb)
11431138
{
1139+
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(self);
1140+
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(bb);
11441141
PyObject *it, *v;
11451142

11461143
it = PyObject_GetIter(bb);
@@ -2647,12 +2644,12 @@ static int
26472644
array_ass_subscr_lock_held(PyObject *op, PyObject* item, PyObject* value)
26482645
{
26492646
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(op);
2647+
#ifdef Py_DEBUG
2648+
if (value != NULL) {
2649+
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(value);
2650+
}
2651+
#endif
26502652
arrayobject *self = arrayobject_CAST(op);
2651-
#ifdef Py_DEBUG
2652-
if (value != NULL) {
2653-
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(value);
2654-
}
2655-
#endif
26562653
Py_ssize_t start, stop, step, slicelength, needed;
26572654
array_state* state = find_array_state_by_type(Py_TYPE(self));
26582655
arrayobject* other;
@@ -3316,11 +3313,9 @@ array_arrayiterator___reduce___impl(arrayiterobject *self, PyTypeObject *cls)
33163313
PyObject *ret = NULL;
33173314
Py_ssize_t index = FT_ATOMIC_LOAD_SSIZE_RELAXED(self->index);
33183315
if (index >= 0) {
3319-
Py_BEGIN_CRITICAL_SECTION(self->ao);
33203316
if (index <= Py_SIZE(self->ao)) {
33213317
ret = Py_BuildValue("N(O)n", func, self->ao, index);
33223318
}
3323-
Py_END_CRITICAL_SECTION();
33243319
}
33253320
if (ret == NULL) {
33263321
ret = Py_BuildValue("N(())", func);

0 commit comments

Comments
 (0)