3
3
#include "Python.h"
4
4
#include "pycore_abstract.h" // _PyIndex_Check()
5
5
#include "pycore_ceval.h" // _PyEval_GetBuiltin()
6
+ #include "pycore_critical_section.h" // _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED()
6
7
#include "pycore_dict.h" // _PyDictViewObject
7
8
#include "pycore_pyatomic_ft_wrappers.h"
8
9
#include "pycore_interp.h" // PyInterpreterState.list
@@ -81,6 +82,11 @@ static void
81
82
ensure_shared_on_resize (PyListObject * self )
82
83
{
83
84
#ifdef Py_GIL_DISABLED
85
+ // We can't use _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED here because
86
+ // the `CALL_LIST_APPEND` bytecode handler may lock the list without
87
+ // a critical section.
88
+ assert (Py_REFCNT (self ) == 1 || PyMutex_IsLocked (& _PyObject_CAST (self )-> ob_mutex ));
89
+
84
90
// Ensure that the list array is freed using QSBR if we are not the
85
91
// owning thread.
86
92
if (!_Py_IsOwnedByCurrentThread ((PyObject * )self ) &&
@@ -995,10 +1001,12 @@ list_ass_slice(PyListObject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
995
1001
Py_ssize_t n = PyList_GET_SIZE (a );
996
1002
PyObject * copy = list_slice_lock_held (a , 0 , n );
997
1003
if (copy == NULL ) {
998
- return -1 ;
1004
+ ret = -1 ;
1005
+ }
1006
+ else {
1007
+ ret = list_ass_slice_lock_held (a , ilow , ihigh , copy );
1008
+ Py_DECREF (copy );
999
1009
}
1000
- ret = list_ass_slice_lock_held (a , ilow , ihigh , copy );
1001
- Py_DECREF (copy );
1002
1010
Py_END_CRITICAL_SECTION ();
1003
1011
}
1004
1012
else if (v != NULL && PyList_CheckExact (v )) {
@@ -1475,7 +1483,9 @@ PyList_Clear(PyObject *self)
1475
1483
PyErr_BadInternalCall ();
1476
1484
return -1 ;
1477
1485
}
1486
+ Py_BEGIN_CRITICAL_SECTION (self );
1478
1487
list_clear ((PyListObject * )self );
1488
+ Py_END_CRITICAL_SECTION ();
1479
1489
return 0 ;
1480
1490
}
1481
1491
@@ -3446,7 +3456,9 @@ list___init___impl(PyListObject *self, PyObject *iterable)
3446
3456
3447
3457
/* Empty previous contents */
3448
3458
if (self -> ob_item != NULL ) {
3459
+ Py_BEGIN_CRITICAL_SECTION (self );
3449
3460
list_clear (self );
3461
+ Py_END_CRITICAL_SECTION ();
3450
3462
}
3451
3463
if (iterable != NULL ) {
3452
3464
if (_list_extend (self , iterable ) < 0 ) {
@@ -3619,16 +3631,18 @@ adjust_slice_indexes(PyListObject *lst,
3619
3631
}
3620
3632
3621
3633
static int
3622
- list_ass_subscript (PyObject * _self , PyObject * item , PyObject * value )
3634
+ list_ass_subscript_lock_held (PyObject * _self , PyObject * item , PyObject * value )
3623
3635
{
3636
+ _Py_CRITICAL_SECTION_ASSERT_OBJECT_LOCKED (_self );
3637
+
3624
3638
PyListObject * self = (PyListObject * )_self ;
3625
3639
if (_PyIndex_Check (item )) {
3626
3640
Py_ssize_t i = PyNumber_AsSsize_t (item , PyExc_IndexError );
3627
3641
if (i == -1 && PyErr_Occurred ())
3628
3642
return -1 ;
3629
3643
if (i < 0 )
3630
3644
i += PyList_GET_SIZE (self );
3631
- return list_ass_item (( PyObject * ) self , i , value );
3645
+ return list_ass_item_lock_held ( self , i , value );
3632
3646
}
3633
3647
else if (PySlice_Check (item )) {
3634
3648
Py_ssize_t start , stop , step ;
@@ -3648,7 +3662,7 @@ list_ass_subscript(PyObject* _self, PyObject* item, PyObject* value)
3648
3662
step );
3649
3663
3650
3664
if (step == 1 )
3651
- return list_ass_slice (self , start , stop , value );
3665
+ return list_ass_slice_lock_held (self , start , stop , value );
3652
3666
3653
3667
if (slicelength <= 0 )
3654
3668
return 0 ;
@@ -3714,10 +3728,8 @@ list_ass_subscript(PyObject* _self, PyObject* item, PyObject* value)
3714
3728
3715
3729
/* protect against a[::-1] = a */
3716
3730
if (self == (PyListObject * )value ) {
3717
- Py_BEGIN_CRITICAL_SECTION (value );
3718
- seq = list_slice_lock_held ((PyListObject * )value , 0 ,
3731
+ seq = list_slice_lock_held ((PyListObject * )value , 0 ,
3719
3732
Py_SIZE (value ));
3720
- Py_END_CRITICAL_SECTION ();
3721
3733
}
3722
3734
else {
3723
3735
seq = PySequence_Fast (value ,
@@ -3731,7 +3743,7 @@ list_ass_subscript(PyObject* _self, PyObject* item, PyObject* value)
3731
3743
step );
3732
3744
3733
3745
if (step == 1 ) {
3734
- int res = list_ass_slice (self , start , stop , seq );
3746
+ int res = list_ass_slice_lock_held (self , start , stop , seq );
3735
3747
Py_DECREF (seq );
3736
3748
return res ;
3737
3749
}
@@ -3787,6 +3799,24 @@ list_ass_subscript(PyObject* _self, PyObject* item, PyObject* value)
3787
3799
}
3788
3800
}
3789
3801
3802
+ static int
3803
+ list_ass_subscript (PyObject * self , PyObject * item , PyObject * value )
3804
+ {
3805
+ int res ;
3806
+ #ifdef Py_GIL_DISABLED
3807
+ if (PySlice_Check (item ) && value != NULL && PyList_CheckExact (value )) {
3808
+ Py_BEGIN_CRITICAL_SECTION2 (self , value );
3809
+ res = list_ass_subscript_lock_held (self , item , value );
3810
+ Py_END_CRITICAL_SECTION2 ();
3811
+ return res ;
3812
+ }
3813
+ #endif
3814
+ Py_BEGIN_CRITICAL_SECTION (self );
3815
+ res = list_ass_subscript_lock_held (self , item , value );
3816
+ Py_END_CRITICAL_SECTION ();
3817
+ return res ;
3818
+ }
3819
+
3790
3820
static PyMappingMethods list_as_mapping = {
3791
3821
list_length ,
3792
3822
list_subscript ,
0 commit comments