]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-112087: Update list.{pop,clear,reverse,remove} to use CS (gh-113764)
authorDonghee Na <donghee.na@python.org>
Tue, 9 Jan 2024 00:00:55 +0000 (09:00 +0900)
committerGitHub <noreply@github.com>
Tue, 9 Jan 2024 00:00:55 +0000 (09:00 +0900)
Objects/clinic/listobject.c.h
Objects/listobject.c

index 54e6060451f3ffbd0120f5215aad294a91b2358d..cf6f7449df5e1d70ad9c93c4661e9abcdf30152f 100644 (file)
@@ -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]*/
index dfb8cd2b106511084b636304653f051430097aac..5cd4a059c668ba6de1a3e0db449c621c2635d66a 100644 (file)
@@ -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;