gh-117657: Fix TSAN list set failure (#118260)

* Fix TSAN list set failure

* Relaxed atomic is sufficient, add targetted test

* More list

* Remove atomic assign in list

* Fixup white space
This commit is contained in:
Dino Viehland 2024-05-02 13:03:05 -07:00 committed by GitHub
parent 8ed5466795
commit 1e67b9207c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 90 additions and 3 deletions

View file

@ -0,0 +1,80 @@
import unittest
from threading import Thread
from unittest import TestCase
from test.support import is_wasi
class C:
def __init__(self, v):
self.v = v
@unittest.skipIf(is_wasi, "WASI has no threads.")
class TestList(TestCase):
def test_racing_iter_append(self):
l = []
OBJECT_COUNT = 10000
def writer_func():
for i in range(OBJECT_COUNT):
l.append(C(i + OBJECT_COUNT))
def reader_func():
while True:
count = len(l)
for i, x in enumerate(l):
self.assertEqual(x.v, i + OBJECT_COUNT)
if count == OBJECT_COUNT:
break
writer = Thread(target=writer_func)
readers = []
for x in range(30):
reader = Thread(target=reader_func)
readers.append(reader)
reader.start()
writer.start()
writer.join()
for reader in readers:
reader.join()
def test_racing_iter_extend(self):
iters = [
lambda x: [x],
]
for iter_case in iters:
with self.subTest(iter=iter_case):
l = []
OBJECT_COUNT = 10000
def writer_func():
for i in range(OBJECT_COUNT):
l.extend(iter_case(C(i + OBJECT_COUNT)))
def reader_func():
while True:
count = len(l)
for i, x in enumerate(l):
self.assertEqual(x.v, i + OBJECT_COUNT)
if count == OBJECT_COUNT:
break
writer = Thread(target=writer_func)
readers = []
for x in range(30):
reader = Thread(target=reader_func)
readers.append(reader)
reader.start()
writer.start()
writer.join()
for reader in readers:
reader.join()
if __name__ == "__main__":
unittest.main()