|
26 | 26 | import sysconfig |
27 | 27 | import tempfile |
28 | 28 | import textwrap |
| 29 | +import threading |
29 | 30 | import time |
30 | 31 | import types |
31 | 32 | import unittest |
|
37 | 38 | from test.support import socket_helper |
38 | 39 | from test.support import infinite_recursion |
39 | 40 | from test.support import warnings_helper |
| 41 | +from test.support import threading_helper |
40 | 42 | from platform import win32_is_iot |
41 | 43 |
|
42 | 44 | try: |
@@ -5406,6 +5408,49 @@ def test_resource_warning(self): |
5406 | 5408 | with self.check_no_resource_warning(): |
5407 | 5409 | del iterator |
5408 | 5410 |
|
| 5411 | + @support.requires_resource('cpu') |
| 5412 | + @threading_helper.requires_working_threading() |
| 5413 | + def test_races_scandir_iterations(self): |
| 5414 | + N = 4 |
| 5415 | + ITERATIONS = 10 if support.check_sanitizer(address=True) else 1000 |
| 5416 | + |
| 5417 | + self.create_file("file.txt") |
| 5418 | + self.create_file("file2.txt") |
| 5419 | + |
| 5420 | + def scan(iter, barrier): |
| 5421 | + barrier.wait() |
| 5422 | + for entry in iter: |
| 5423 | + pass |
| 5424 | + |
| 5425 | + for _ in range(ITERATIONS): |
| 5426 | + barrier = threading.Barrier(N) |
| 5427 | + iter = os.scandir(self.path) |
| 5428 | + |
| 5429 | + threads = [threading.Thread(target=scan, args=(iter, barrier)) |
| 5430 | + for _ in range(N)] |
| 5431 | + with threading_helper.start_threads(threads): |
| 5432 | + pass |
| 5433 | + |
| 5434 | + @threading_helper.requires_working_threading() |
| 5435 | + @unittest.skipUnless(support.check_sanitizer(address=True), "requires ASAN") |
| 5436 | + def test_races_scandir_entry(self): |
| 5437 | + N = 2 |
| 5438 | + ITERATIONS = 10 |
| 5439 | + |
| 5440 | + self.create_file("file.txt") |
| 5441 | + self.create_file("file2.txt") |
| 5442 | + |
| 5443 | + def stat(entry, barrier): |
| 5444 | + barrier.wait() |
| 5445 | + entry.stat() |
| 5446 | + |
| 5447 | + for _ in range(ITERATIONS): |
| 5448 | + barrier = threading.Barrier(N) |
| 5449 | + for entry in os.scandir(self.path): |
| 5450 | + threads = [threading.Thread(target=stat, args=(entry, barrier)) |
| 5451 | + for _ in range(N)] |
| 5452 | + with threading_helper.start_threads(threads): |
| 5453 | + pass |
5409 | 5454 |
|
5410 | 5455 | class TestPEP519(unittest.TestCase): |
5411 | 5456 |
|
|
0 commit comments