mirror of
https://github.com/python/cpython.git
synced 2025-09-26 10:19:53 +00:00
gh-129107: fix thread safety of bytearray
where two critical sections are needed (#130227)
This commit is contained in:
parent
8ba0d7bbc2
commit
e85f81f430
3 changed files with 33 additions and 6 deletions
|
@ -2380,12 +2380,22 @@ class FreeThreadingTest(unittest.TestCase):
|
|||
b.wait()
|
||||
a[:] = c
|
||||
|
||||
def ass_subscript2(b, a, c): # MODIFIES!
|
||||
b.wait()
|
||||
a[:] = c
|
||||
assert b'\xdd' not in a
|
||||
|
||||
def mod(b, a):
|
||||
c = tuple(range(4096))
|
||||
b.wait()
|
||||
try: a % c
|
||||
except TypeError: pass
|
||||
|
||||
def mod2(b, a, c):
|
||||
b.wait()
|
||||
d = a % c
|
||||
assert b'\xdd' not in d
|
||||
|
||||
def repr_(b, a):
|
||||
b.wait()
|
||||
repr(a)
|
||||
|
@ -2503,7 +2513,9 @@ class FreeThreadingTest(unittest.TestCase):
|
|||
|
||||
check([clear] + [contains] * 10)
|
||||
check([clear] + [subscript] * 10)
|
||||
check([clear2] + [ass_subscript2] * 10, None, bytearray(b'0' * 0x400000))
|
||||
check([clear] + [mod] * 10, bytearray(b'%d' * 4096))
|
||||
check([clear2] + [mod2] * 10, bytearray(b'%s'), bytearray(b'0' * 0x400000))
|
||||
|
||||
check([clear] + [capitalize] * 10, bytearray(b'a' * 0x40000))
|
||||
check([clear] + [center] * 10, bytearray(b'a' * 0x40000))
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Fix two more :class:`bytearray` functions for :term:`free threading`.
|
|
@ -864,9 +864,16 @@ static int
|
|||
bytearray_ass_subscript(PyObject *op, PyObject *index, PyObject *values)
|
||||
{
|
||||
int ret;
|
||||
if (values != NULL && PyByteArray_Check(values)) {
|
||||
Py_BEGIN_CRITICAL_SECTION2(op, values);
|
||||
ret = bytearray_ass_subscript_lock_held(op, index, values);
|
||||
Py_END_CRITICAL_SECTION2();
|
||||
}
|
||||
else {
|
||||
Py_BEGIN_CRITICAL_SECTION(op);
|
||||
ret = bytearray_ass_subscript_lock_held(op, index, values);
|
||||
Py_END_CRITICAL_SECTION();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -2751,9 +2758,16 @@ static PyObject *
|
|||
bytearray_mod(PyObject *v, PyObject *w)
|
||||
{
|
||||
PyObject *ret;
|
||||
if (PyByteArray_Check(w)) {
|
||||
Py_BEGIN_CRITICAL_SECTION2(v, w);
|
||||
ret = bytearray_mod_lock_held(v, w);
|
||||
Py_END_CRITICAL_SECTION2();
|
||||
}
|
||||
else {
|
||||
Py_BEGIN_CRITICAL_SECTION(v);
|
||||
ret = bytearray_mod_lock_held(v, w);
|
||||
Py_END_CRITICAL_SECTION();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue