44
55from test .support import threading_helper
66
7- NTHREADS = 8
8-
9- # Fresh objects expose one-time races under ThreadSanitizer.
10- ROUNDS = 20
11- ITERS = 20
7+ NTHREADS = 4
8+ ROUNDS = 4
9+ ITERS = 10
1210
1311HASH_DATA_TEMPLATE = bytes (range (256 ))
1412HASH_DATA_REPEAT = 256
@@ -44,7 +42,8 @@ def run_racy(func, *args):
4442
4543@threading_helper .requires_working_threading ()
4644class TestMemoryViewRaces (unittest .TestCase ):
47- def assert_exporter_free (self , buf ):
45+ def ensure_exporter_free (self , buf ):
46+ # Will raise BufferError if any memoryview still exports it.
4847 buf .append (0 )
4948 del buf [- 1 ]
5049
@@ -77,7 +76,7 @@ def release(views=views):
7776
7877 threading_helper .run_concurrently (release , nthreads = NTHREADS )
7978
80- self .assert_exporter_free (buf )
79+ self .ensure_exporter_free (buf )
8180
8281 def test_release_races_with_reads (self ):
8382 for _ in range (ROUNDS ):
@@ -104,7 +103,7 @@ def reader():
104103 )
105104
106105 cell [0 ].release ()
107- self .assert_exporter_free (buf )
106+ self .ensure_exporter_free (buf )
108107
109108 def test_read_keeps_exporter_alive_after_release (self ):
110109 size = 1 << 20
@@ -157,7 +156,7 @@ def writer(slot):
157156 threading_helper .run_concurrently (workers , nthreads = NTHREADS )
158157
159158 cell [0 ].release ()
160- self .assert_exporter_free (buf )
159+ self .ensure_exporter_free (buf )
161160
162161 def test_release_races_with_buffer_exports (self ):
163162 for _ in range (ROUNDS ):
@@ -177,7 +176,7 @@ def releaser():
177176 )
178177
179178 mv .release ()
180- self .assert_exporter_free (buf )
179+ self .ensure_exporter_free (buf )
181180
182181 def test_release_with_live_export (self ):
183182 buf = bytearray (64 )
@@ -198,7 +197,7 @@ def release(mv=mv):
198197 held .release ()
199198 mv .release ()
200199
201- self .assert_exporter_free (buf )
200+ self .ensure_exporter_free (buf )
202201
203202 def test_compare_two_views_races_with_release (self ):
204203 for _ in range (ROUNDS ):
@@ -220,13 +219,14 @@ def comparer():
220219 run_racy (lambda : left != right )
221220
222221 threading_helper .run_concurrently (
223- [lambda : releaser (0 ), lambda : releaser (1 )] + [comparer ] * 6 ,
222+ [lambda : releaser (0 ), lambda : releaser (1 )]
223+ + [comparer ] * (NTHREADS - 2 ),
224224 nthreads = NTHREADS ,
225225 )
226226
227227 for mv in cell :
228228 mv .release ()
229- self .assert_exporter_free (buf )
229+ self .ensure_exporter_free (buf )
230230
231231 def test_release_parent_keeps_child_valid (self ):
232232 for _ in range (ROUNDS ):
@@ -249,7 +249,7 @@ def release_parent():
249249
250250 self .assertEqual (child .tobytes (), bytes (range (32 )))
251251 child .release ()
252- self .assert_exporter_free (buf )
252+ self .ensure_exporter_free (buf )
253253
254254 def test_concurrent_iteration (self ):
255255 for _ in range (ROUNDS ):
@@ -274,7 +274,7 @@ def iterator():
274274 )
275275
276276 cell [0 ].release ()
277- self .assert_exporter_free (buf )
277+ self .ensure_exporter_free (buf )
278278
279279 def test_iterator_exhaustion_drops_last_reference (self ):
280280 def loop ():
0 commit comments