Skip to content

Commit 9ac81d7

Browse files
committed
Relaxed atomic is sufficient, add targetted test
1 parent f3cc5de commit 9ac81d7

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

Include/cpython/listobject.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ PyList_SET_ITEM(PyObject *op, Py_ssize_t index, PyObject *value) {
4545
assert(0 <= index);
4646
assert(index < list->allocated);
4747
#ifdef Py_GIL_DISABLED
48-
_Py_atomic_store_ptr_release(&list->ob_item[index], value);
48+
_Py_atomic_store_ptr_relaxed(&list->ob_item[index], value);
4949
#else
5050
list->ob_item[index] = value;
5151
#endif
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import unittest
2+
3+
from threading import Thread
4+
from unittest import TestCase
5+
6+
class TestList(TestCase):
7+
def test_racing_iter_append(self):
8+
9+
l = []
10+
OBJECT_COUNT = 10000
11+
def writer_func():
12+
for i in range(OBJECT_COUNT):
13+
l.append(i + OBJECT_COUNT)
14+
15+
def reader_func():
16+
while True:
17+
count = len(l)
18+
for i, x in enumerate(l):
19+
self.assertEqual(x, i + OBJECT_COUNT)
20+
if count == OBJECT_COUNT:
21+
break
22+
23+
writer = Thread(target=writer_func)
24+
readers = []
25+
for x in range(30):
26+
reader = Thread(target=reader_func)
27+
readers.append(reader)
28+
reader.start()
29+
30+
writer.start()
31+
writer.join()
32+
print('writer done')
33+
for reader in readers:
34+
reader.join()
35+
print('reader done')
36+
37+
if __name__ == "__main__":
38+
unittest.main()

0 commit comments

Comments
 (0)