https://github.com/python/cpython/commit/f9c505698a1ac27f5a380780767665ffd2fb8ebc
commit: f9c505698a1ac27f5a380780767665ffd2fb8ebc
branch: main
author: Donghee Na <[email protected]>
committer: corona10 <[email protected]>
date: 2024-01-27T01:20:21+09:00
summary:
gh-112087: Make list_repr and list_length to be thread-safe (gh-114582)
files:
M Include/cpython/listobject.h
M Objects/listobject.c
diff --git a/Include/cpython/listobject.h b/Include/cpython/listobject.h
index 8ade1b164681f9..49f5e8d6d1a0d6 100644
--- a/Include/cpython/listobject.h
+++ b/Include/cpython/listobject.h
@@ -29,7 +29,11 @@ typedef struct {
static inline Py_ssize_t PyList_GET_SIZE(PyObject *op) {
PyListObject *list = _PyList_CAST(op);
+#ifdef Py_GIL_DISABLED
+ return _Py_atomic_load_ssize_relaxed(&(_PyVarObject_CAST(list)->ob_size));
+#else
return Py_SIZE(list);
+#endif
}
#define PyList_GET_SIZE(op) PyList_GET_SIZE(_PyObject_CAST(op))
diff --git a/Objects/listobject.c b/Objects/listobject.c
index 1e885f9cb80c4c..56785e5f37a450 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -383,18 +383,11 @@ list_dealloc(PyObject *self)
}
static PyObject *
-list_repr(PyObject *self)
+list_repr_impl(PyListObject *v)
{
- PyListObject *v = (PyListObject *)self;
- Py_ssize_t i;
PyObject *s;
_PyUnicodeWriter writer;
-
- if (Py_SIZE(v) == 0) {
- return PyUnicode_FromString("[]");
- }
-
- i = Py_ReprEnter((PyObject*)v);
+ Py_ssize_t i = Py_ReprEnter((PyObject*)v);
if (i != 0) {
return i > 0 ? PyUnicode_FromString("[...]") : NULL;
}
@@ -439,10 +432,24 @@ list_repr(PyObject *self)
return NULL;
}
+static PyObject *
+list_repr(PyObject *self)
+{
+ if (PyList_GET_SIZE(self) == 0) {
+ return PyUnicode_FromString("[]");
+ }
+ PyListObject *v = (PyListObject *)self;
+ PyObject *ret = NULL;
+ Py_BEGIN_CRITICAL_SECTION(v);
+ ret = list_repr_impl(v);
+ Py_END_CRITICAL_SECTION();
+ return ret;
+}
+
static Py_ssize_t
list_length(PyObject *a)
{
- return Py_SIZE(a);
+ return PyList_GET_SIZE(a);
}
static int
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]