summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDonghee Na <donghee.na@python.org>2024-01-09 00:00:55 (GMT)
committerGitHub <noreply@github.com>2024-01-09 00:00:55 (GMT)
commita023bc252dc744736bd21897c5a23a25b800df92 (patch)
tree8dd9c2f1c139464e3f20cf148d3cba9734bd2b64
parent10d3f04aec745c6676ef31611549b970a78338b3 (diff)
downloadcpython-a023bc252dc744736bd21897c5a23a25b800df92.zip
cpython-a023bc252dc744736bd21897c5a23a25b800df92.tar.gz
cpython-a023bc252dc744736bd21897c5a23a25b800df92.tar.bz2
gh-112087: Update list.{pop,clear,reverse,remove} to use CS (gh-113764)
-rw-r--r--Objects/clinic/listobject.c.h38
-rw-r--r--Objects/listobject.c17
2 files changed, 46 insertions, 9 deletions
diff --git a/Objects/clinic/listobject.c.h b/Objects/clinic/listobject.c.h
index 54e6060..cf6f744 100644
--- a/Objects/clinic/listobject.c.h
+++ b/Objects/clinic/listobject.c.h
@@ -7,6 +7,7 @@ preserve
# include "pycore_runtime.h" // _Py_ID()
#endif
#include "pycore_abstract.h" // _PyNumber_Index()
+#include "pycore_critical_section.h"// Py_BEGIN_CRITICAL_SECTION()
#include "pycore_modsupport.h" // _PyArg_CheckPositional()
PyDoc_STRVAR(list_insert__doc__,
@@ -44,7 +45,9 @@ list_insert(PyListObject *self, PyObject *const *args, Py_ssize_t nargs)
index = ival;
}
object = args[1];
+ Py_BEGIN_CRITICAL_SECTION(self);
return_value = list_insert_impl(self, index, object);
+ Py_END_CRITICAL_SECTION();
exit:
return return_value;
@@ -65,7 +68,13 @@ py_list_clear_impl(PyListObject *self);
static PyObject *
py_list_clear(PyListObject *self, PyObject *Py_UNUSED(ignored))
{
- return py_list_clear_impl(self);
+ PyObject *return_value = NULL;
+
+ Py_BEGIN_CRITICAL_SECTION(self);
+ return_value = py_list_clear_impl(self);
+ Py_END_CRITICAL_SECTION();
+
+ return return_value;
}
PyDoc_STRVAR(list_copy__doc__,
@@ -143,7 +152,9 @@ list_pop(PyListObject *self, PyObject *const *args, Py_ssize_t nargs)
index = ival;
}
skip_optional:
+ Py_BEGIN_CRITICAL_SECTION(self);
return_value = list_pop_impl(self, index);
+ Py_END_CRITICAL_SECTION();
exit:
return return_value;
@@ -242,7 +253,13 @@ list_reverse_impl(PyListObject *self);
static PyObject *
list_reverse(PyListObject *self, PyObject *Py_UNUSED(ignored))
{
- return list_reverse_impl(self);
+ PyObject *return_value = NULL;
+
+ Py_BEGIN_CRITICAL_SECTION(self);
+ return_value = list_reverse_impl(self);
+ Py_END_CRITICAL_SECTION();
+
+ return return_value;
}
PyDoc_STRVAR(list_index__doc__,
@@ -311,6 +328,21 @@ PyDoc_STRVAR(list_remove__doc__,
#define LIST_REMOVE_METHODDEF \
{"remove", (PyCFunction)list_remove, METH_O, list_remove__doc__},
+static PyObject *
+list_remove_impl(PyListObject *self, PyObject *value);
+
+static PyObject *
+list_remove(PyListObject *self, PyObject *value)
+{
+ PyObject *return_value = NULL;
+
+ Py_BEGIN_CRITICAL_SECTION(self);
+ return_value = list_remove_impl(self, value);
+ Py_END_CRITICAL_SECTION();
+
+ return return_value;
+}
+
PyDoc_STRVAR(list___init____doc__,
"list(iterable=(), /)\n"
"--\n"
@@ -384,4 +416,4 @@ list___reversed__(PyListObject *self, PyObject *Py_UNUSED(ignored))
{
return list___reversed___impl(self);
}
-/*[clinic end generated code: output=f2d7b63119464ff4 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=3c9f24fd3212b18b input=a9049054013a1b77]*/
diff --git a/Objects/listobject.c b/Objects/listobject.c
index dfb8cd2..5cd4a05 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -798,6 +798,7 @@ list_ass_item(PyObject *aa, Py_ssize_t i, PyObject *v)
}
/*[clinic input]
+@critical_section
list.insert
index: Py_ssize_t
@@ -809,7 +810,7 @@ Insert object before index.
static PyObject *
list_insert_impl(PyListObject *self, Py_ssize_t index, PyObject *object)
-/*[clinic end generated code: output=7f35e32f60c8cb78 input=858514cf894c7eab]*/
+/*[clinic end generated code: output=7f35e32f60c8cb78 input=b1987ca998a4ae2d]*/
{
if (ins1(self, index, object) == 0)
Py_RETURN_NONE;
@@ -817,6 +818,7 @@ list_insert_impl(PyListObject *self, Py_ssize_t index, PyObject *object)
}
/*[clinic input]
+@critical_section
list.clear as py_list_clear
Remove all items from list.
@@ -824,7 +826,7 @@ Remove all items from list.
static PyObject *
py_list_clear_impl(PyListObject *self)
-/*[clinic end generated code: output=83726743807e3518 input=378711e10f545c53]*/
+/*[clinic end generated code: output=83726743807e3518 input=e285b7f09051a9ba]*/
{
list_clear(self);
Py_RETURN_NONE;
@@ -1062,6 +1064,7 @@ list_inplace_concat(PyObject *_self, PyObject *other)
}
/*[clinic input]
+@critical_section
list.pop
index: Py_ssize_t = -1
@@ -1074,7 +1077,7 @@ Raises IndexError if list is empty or index is out of range.
static PyObject *
list_pop_impl(PyListObject *self, Py_ssize_t index)
-/*[clinic end generated code: output=6bd69dcb3f17eca8 input=b83675976f329e6f]*/
+/*[clinic end generated code: output=6bd69dcb3f17eca8 input=c269141068ae4b8f]*/
{
PyObject *v;
int status;
@@ -2593,6 +2596,7 @@ PyList_Sort(PyObject *v)
}
/*[clinic input]
+@critical_section
list.reverse
Reverse *IN PLACE*.
@@ -2600,7 +2604,7 @@ Reverse *IN PLACE*.
static PyObject *
list_reverse_impl(PyListObject *self)
-/*[clinic end generated code: output=482544fc451abea9 input=eefd4c3ae1bc9887]*/
+/*[clinic end generated code: output=482544fc451abea9 input=04ac8e0c6a66e4d9]*/
{
if (Py_SIZE(self) > 1)
reverse_slice(self->ob_item, self->ob_item + Py_SIZE(self));
@@ -2730,6 +2734,7 @@ list_count(PyListObject *self, PyObject *value)
}
/*[clinic input]
+@critical_section
list.remove
value: object
@@ -2741,8 +2746,8 @@ Raises ValueError if the value is not present.
[clinic start generated code]*/
static PyObject *
-list_remove(PyListObject *self, PyObject *value)
-/*[clinic end generated code: output=f087e1951a5e30d1 input=2dc2ba5bb2fb1f82]*/
+list_remove_impl(PyListObject *self, PyObject *value)
+/*[clinic end generated code: output=b9b76a6633b18778 input=26c813dbb95aa93b]*/
{
Py_ssize_t i;