Skip to content

Commit ed5cac0

Browse files
add critical to array
1 parent e42bda9 commit ed5cac0

File tree

1 file changed

+58
-20
lines changed

1 file changed

+58
-20
lines changed

Modules/_ctypes/_ctypes.c

Lines changed: 58 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3326,11 +3326,11 @@ PyObject *
33263326
PyCData_get(ctypes_state *st, PyObject *type, GETFUNC getfunc, PyObject *src,
33273327
Py_ssize_t index, Py_ssize_t size, char *adr)
33283328
{
3329+
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(src);
3330+
33293331
if (getfunc) {
33303332
PyObject *res;
3331-
Py_BEGIN_CRITICAL_SECTION(src);
33323333
res = getfunc(adr, size);
3333-
Py_END_CRITICAL_SECTION();
33343334
return res;
33353335
}
33363336
assert(type);
@@ -3340,9 +3340,7 @@ PyCData_get(ctypes_state *st, PyObject *type, GETFUNC getfunc, PyObject *src,
33403340
}
33413341
if (info && info->getfunc && !_ctypes_simple_instance(st, type)) {
33423342
PyObject *res;
3343-
Py_BEGIN_CRITICAL_SECTION(src);
33443343
res = info->getfunc(adr, size);
3345-
Py_END_CRITICAL_SECTION();
33463344
return res;
33473345
}
33483346
return PyCData_FromBaseObj(st, type, src, index, adr);
@@ -4892,8 +4890,10 @@ Array_init(PyObject *self, PyObject *args, PyObject *kw)
48924890
}
48934891

48944892
static PyObject *
4895-
Array_item(PyObject *myself, Py_ssize_t index)
4893+
Array_item_lock_held(PyObject *myself, Py_ssize_t index)
48964894
{
4895+
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(myself);
4896+
48974897
CDataObject *self = _CDataObject_CAST(myself);
48984898
Py_ssize_t offset, size;
48994899

@@ -4920,8 +4920,20 @@ Array_item(PyObject *myself, Py_ssize_t index)
49204920
}
49214921

49224922
static PyObject *
4923-
Array_subscript(PyObject *myself, PyObject *item)
4923+
Array_item(PyObject *myself, Py_ssize_t index)
49244924
{
4925+
PyObject *result;
4926+
Py_BEGIN_CRITICAL_SECTION(myself);
4927+
result = Array_item_lock_held(myself, index);
4928+
Py_END_CRITICAL_SECTION();
4929+
return result;
4930+
}
4931+
4932+
static PyObject *
4933+
Array_subscript_lock_held(PyObject *myself, PyObject *item)
4934+
{
4935+
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(myself);
4936+
49254937
CDataObject *self = _CDataObject_CAST(myself);
49264938

49274939
if (PyIndex_Check(item)) {
@@ -4931,7 +4943,7 @@ Array_subscript(PyObject *myself, PyObject *item)
49314943
return NULL;
49324944
if (i < 0)
49334945
i += self->b_length;
4934-
return Array_item(myself, i);
4946+
return Array_item_lock_held(myself, i);
49354947
}
49364948
else if (PySlice_Check(item)) {
49374949
PyObject *proto;
@@ -4966,23 +4978,19 @@ Array_subscript(PyObject *myself, PyObject *item)
49664978
return Py_GetConstant(Py_CONSTANT_EMPTY_BYTES);
49674979
if (step == 1) {
49684980
PyObject *res;
4969-
Py_BEGIN_CRITICAL_SECTION(self);
49704981
res = PyBytes_FromStringAndSize(ptr + start,
49714982
slicelen);
4972-
Py_END_CRITICAL_SECTION();
49734983
return res;
49744984
}
49754985
dest = (char *)PyMem_Malloc(slicelen);
49764986

49774987
if (dest == NULL)
49784988
return PyErr_NoMemory();
49794989

4980-
Py_BEGIN_CRITICAL_SECTION(self);
49814990
for (cur = start, i = 0; i < slicelen;
49824991
cur += step, i++) {
49834992
dest[i] = ptr[cur];
49844993
}
4985-
Py_END_CRITICAL_SECTION();
49864994

49874995
np = PyBytes_FromStringAndSize(dest, slicelen);
49884996
PyMem_Free(dest);
@@ -4996,10 +5004,8 @@ Array_subscript(PyObject *myself, PyObject *item)
49965004
return Py_GetConstant(Py_CONSTANT_EMPTY_STR);
49975005
if (step == 1) {
49985006
PyObject *res;
4999-
Py_BEGIN_CRITICAL_SECTION(self);
50005007
res = PyUnicode_FromWideChar(ptr + start,
50015008
slicelen);
5002-
Py_END_CRITICAL_SECTION();
50035009
return res;
50045010
}
50055011

@@ -5009,12 +5015,10 @@ Array_subscript(PyObject *myself, PyObject *item)
50095015
return NULL;
50105016
}
50115017

5012-
Py_BEGIN_CRITICAL_SECTION(self);
50135018
for (cur = start, i = 0; i < slicelen;
50145019
cur += step, i++) {
50155020
dest[i] = ptr[cur];
50165021
}
5017-
Py_END_CRITICAL_SECTION();
50185022

50195023
np = PyUnicode_FromWideChar(dest, slicelen);
50205024
PyMem_Free(dest);
@@ -5027,7 +5031,7 @@ Array_subscript(PyObject *myself, PyObject *item)
50275031

50285032
for (cur = start, i = 0; i < slicelen;
50295033
cur += step, i++) {
5030-
PyObject *v = Array_item(myself, cur);
5034+
PyObject *v = Array_item_lock_held(myself, cur);
50315035
if (v == NULL) {
50325036
Py_DECREF(np);
50335037
return NULL;
@@ -5041,12 +5045,24 @@ Array_subscript(PyObject *myself, PyObject *item)
50415045
"indices must be integers");
50425046
return NULL;
50435047
}
5048+
}
50445049

5050+
5051+
static PyObject *
5052+
Array_subscript(PyObject *myself, PyObject *item)
5053+
{
5054+
PyObject *result;
5055+
Py_BEGIN_CRITICAL_SECTION(myself);
5056+
result = Array_subscript_lock_held(myself, item);
5057+
Py_END_CRITICAL_SECTION();
5058+
return result;
50455059
}
50465060

50475061
static int
5048-
Array_ass_item(PyObject *myself, Py_ssize_t index, PyObject *value)
5062+
Array_ass_item_lock_held(PyObject *myself, Py_ssize_t index, PyObject *value)
50495063
{
5064+
_Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED(myself);
5065+
50505066
CDataObject *self = _CDataObject_CAST(myself);
50515067
Py_ssize_t size, offset;
50525068
char *ptr;
@@ -5078,7 +5094,18 @@ Array_ass_item(PyObject *myself, Py_ssize_t index, PyObject *value)
50785094
}
50795095

50805096
static int
5081-
Array_ass_subscript(PyObject *myself, PyObject *item, PyObject *value)
5097+
Array_ass_item(PyObject *myself, Py_ssize_t index, PyObject *value)
5098+
{
5099+
int result;
5100+
Py_BEGIN_CRITICAL_SECTION(myself);
5101+
result = Array_ass_item_lock_held(myself, index, value);
5102+
Py_END_CRITICAL_SECTION();
5103+
return result;
5104+
}
5105+
5106+
5107+
static int
5108+
Array_ass_subscript_lock_held(PyObject *myself, PyObject *item, PyObject *value)
50825109
{
50835110
CDataObject *self = _CDataObject_CAST(myself);
50845111

@@ -5095,7 +5122,7 @@ Array_ass_subscript(PyObject *myself, PyObject *item, PyObject *value)
50955122
return -1;
50965123
if (i < 0)
50975124
i += self->b_length;
5098-
return Array_ass_item(myself, i, value);
5125+
return Array_ass_item_lock_held(myself, i, value);
50995126
}
51005127
else if (PySlice_Check(item)) {
51015128
Py_ssize_t start, stop, step, slicelen, otherlen, i;
@@ -5120,7 +5147,7 @@ Array_ass_subscript(PyObject *myself, PyObject *item, PyObject *value)
51205147
int result;
51215148
if (item == NULL)
51225149
return -1;
5123-
result = Array_ass_item(myself, cur, item);
5150+
result = Array_ass_item_lock_held(myself, cur, item);
51245151
Py_DECREF(item);
51255152
if (result == -1)
51265153
return -1;
@@ -5134,6 +5161,17 @@ Array_ass_subscript(PyObject *myself, PyObject *item, PyObject *value)
51345161
}
51355162
}
51365163

5164+
static int
5165+
Array_ass_subscript(PyObject *myself, PyObject *item, PyObject *value)
5166+
{
5167+
int result;
5168+
Py_BEGIN_CRITICAL_SECTION(myself);
5169+
result = Array_ass_subscript_lock_held(myself, item, value);
5170+
Py_END_CRITICAL_SECTION();
5171+
return result;
5172+
}
5173+
5174+
51375175
static Py_ssize_t
51385176
Array_length(PyObject *myself)
51395177
{

0 commit comments

Comments
 (0)