summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorDonghee Na <donghee.na@python.org>2024-01-31 23:58:08 (GMT)
committerGitHub <noreply@github.com>2024-01-31 23:58:08 (GMT)
commit7b9d406729e7e7adc482b5b8c920de1874c234d0 (patch)
tree67372ea241dbcf063e658415a8cab7063cd07794 /Objects
parent1836f674c0d86ec3375189a550c8f4a52ff89ae8 (diff)
downloadcpython-7b9d406729e7e7adc482b5b8c920de1874c234d0.zip
cpython-7b9d406729e7e7adc482b5b8c920de1874c234d0.tar.gz
cpython-7b9d406729e7e7adc482b5b8c920de1874c234d0.tar.bz2
gh-112087: Make PyList_{Append,Size,GetSlice} to be thread-safe (gh-114651)
Diffstat (limited to 'Objects')
-rw-r--r--Objects/listobject.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/Objects/listobject.c b/Objects/listobject.c
index 56785e5..80a1f1d 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -30,7 +30,6 @@ get_list_state(void)
}
#endif
-
/* Ensure ob_item has room for at least newsize elements, and set
* ob_size to newsize. If newsize > ob_size on entry, the content
* of the new slots at exit is undefined heap trash; it's the caller's
@@ -221,8 +220,9 @@ PyList_Size(PyObject *op)
PyErr_BadInternalCall();
return -1;
}
- else
- return Py_SIZE(op);
+ else {
+ return PyList_GET_SIZE(op);
+ }
}
static inline int
@@ -328,7 +328,7 @@ PyList_Insert(PyObject *op, Py_ssize_t where, PyObject *newitem)
int
_PyList_AppendTakeRefListResize(PyListObject *self, PyObject *newitem)
{
- Py_ssize_t len = PyList_GET_SIZE(self);
+ Py_ssize_t len = Py_SIZE(self);
assert(self->allocated == -1 || self->allocated == len);
if (list_resize(self, len + 1) < 0) {
Py_DECREF(newitem);
@@ -342,7 +342,11 @@ int
PyList_Append(PyObject *op, PyObject *newitem)
{
if (PyList_Check(op) && (newitem != NULL)) {
- return _PyList_AppendTakeRef((PyListObject *)op, Py_NewRef(newitem));
+ int ret;
+ Py_BEGIN_CRITICAL_SECTION(op);
+ ret = _PyList_AppendTakeRef((PyListObject *)op, Py_NewRef(newitem));
+ Py_END_CRITICAL_SECTION();
+ return ret;
}
PyErr_BadInternalCall();
return -1;
@@ -473,7 +477,7 @@ static PyObject *
list_item(PyObject *aa, Py_ssize_t i)
{
PyListObject *a = (PyListObject *)aa;
- if (!valid_index(i, Py_SIZE(a))) {
+ if (!valid_index(i, PyList_GET_SIZE(a))) {
PyErr_SetObject(PyExc_IndexError, &_Py_STR(list_err));
return NULL;
}
@@ -511,6 +515,8 @@ PyList_GetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
PyErr_BadInternalCall();
return NULL;
}
+ PyObject *ret;
+ Py_BEGIN_CRITICAL_SECTION(a);
if (ilow < 0) {
ilow = 0;
}
@@ -523,7 +529,9 @@ PyList_GetSlice(PyObject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
else if (ihigh > Py_SIZE(a)) {
ihigh = Py_SIZE(a);
}
- return list_slice((PyListObject *)a, ilow, ihigh);
+ ret = list_slice((PyListObject *)a, ilow, ihigh);
+ Py_END_CRITICAL_SECTION();
+ return ret;
}
static PyObject *