mirror of
https://github.com/python/cpython.git
synced 2025-12-23 09:19:18 +00:00
Some checks failed
Tests / Change detection (push) Waiting to run
Tests / Docs (push) Blocked by required conditions
Tests / Windows MSI (push) Blocked by required conditions
Tests / (push) Blocked by required conditions
Tests / Check if Autoconf files are up to date (push) Blocked by required conditions
Tests / Check if generated files are up to date (push) Blocked by required conditions
Tests / Ubuntu SSL tests with OpenSSL (push) Blocked by required conditions
Tests / Android (aarch64) (push) Blocked by required conditions
Tests / Ubuntu SSL tests with AWS-LC (push) Blocked by required conditions
Tests / Android (x86_64) (push) Blocked by required conditions
Tests / iOS (push) Blocked by required conditions
Tests / WASI (push) Blocked by required conditions
Tests / Hypothesis tests on Ubuntu (push) Blocked by required conditions
Tests / Address sanitizer (push) Blocked by required conditions
Tests / Sanitizers (push) Blocked by required conditions
Tests / Cross build Linux (push) Blocked by required conditions
Tests / CIFuzz (push) Blocked by required conditions
Tests / All required checks pass (push) Blocked by required conditions
Lint / lint (push) Waiting to run
mypy / Run mypy on Lib/_pyrepl (push) Waiting to run
mypy / Run mypy on Lib/test/libregrtest (push) Waiting to run
mypy / Run mypy on Lib/tomllib (push) Waiting to run
mypy / Run mypy on Tools/build (push) Waiting to run
mypy / Run mypy on Tools/cases_generator (push) Waiting to run
mypy / Run mypy on Tools/clinic (push) Waiting to run
mypy / Run mypy on Tools/jit (push) Waiting to run
mypy / Run mypy on Tools/peg_generator (push) Waiting to run
JIT / Interpreter (Debug) (push) Has been cancelled
Tail calling interpreter / aarch64-apple-darwin/clang (push) Has been cancelled
Tail calling interpreter / aarch64-unknown-linux-gnu/gcc (push) Has been cancelled
Tail calling interpreter / x86_64-pc-windows-msvc/msvc (push) Has been cancelled
Tail calling interpreter / x86_64-apple-darwin/clang (push) Has been cancelled
Tail calling interpreter / free-threading (push) Has been cancelled
Tail calling interpreter / x86_64-unknown-linux-gnu/gcc (push) Has been cancelled
JIT / aarch64-pc-windows-msvc/msvc (Debug) (push) Has been cancelled
JIT / i686-pc-windows-msvc/msvc (Release) (push) Has been cancelled
JIT / aarch64-unknown-linux-gnu/gcc (Release) (push) Has been cancelled
JIT / aarch64-apple-darwin/clang (Debug) (push) Has been cancelled
JIT / aarch64-pc-windows-msvc/msvc (Release) (push) Has been cancelled
JIT / i686-pc-windows-msvc/msvc (Debug) (push) Has been cancelled
JIT / aarch64-apple-darwin/clang (Release) (push) Has been cancelled
JIT / aarch64-unknown-linux-gnu/gcc (Debug) (push) Has been cancelled
JIT / x86_64-pc-windows-msvc/msvc (Release) (push) Has been cancelled
JIT / x86_64-pc-windows-msvc/msvc (Debug) (push) Has been cancelled
JIT / x86_64-apple-darwin/clang (Release) (push) Has been cancelled
JIT / x86_64-unknown-linux-gnu/gcc (Release) (push) Has been cancelled
JIT / x86_64-apple-darwin/clang (Debug) (push) Has been cancelled
JIT / x86_64-unknown-linux-gnu/gcc (Debug) (push) Has been cancelled
JIT / Free-Threaded (Debug) (push) Has been cancelled
JIT / JIT without optimizations (Debug) (push) Has been cancelled
JIT / JIT with tail calling interpreter (push) Has been cancelled
Added atomic operations to `scanner_begin()` and `scanner_end()` to prevent race conditions on the `executing` flag in free-threaded builds. Also added tests for concurrent usage of the `re` module. Without the atomic operations, `test_scanner_concurrent_access()` triggers `assert(self->executing)` failures, or a thread sanitizer run emits errors.
62 lines
2 KiB
Python
62 lines
2 KiB
Python
import re
|
|
import unittest
|
|
|
|
from test.support import threading_helper
|
|
from test.support.threading_helper import run_concurrently
|
|
|
|
|
|
NTHREADS = 10
|
|
|
|
|
|
@threading_helper.requires_working_threading()
|
|
class TestRe(unittest.TestCase):
|
|
def test_pattern_sub(self):
|
|
"""Pattern substitution should work across threads"""
|
|
pattern = re.compile(r"\w+@\w+\.\w+")
|
|
text = "e-mail: test@python.org or user@pycon.org. " * 5
|
|
results = []
|
|
|
|
def worker():
|
|
substituted = pattern.sub("(redacted)", text)
|
|
results.append(substituted.count("(redacted)"))
|
|
|
|
run_concurrently(worker_func=worker, nthreads=NTHREADS)
|
|
self.assertEqual(results, [2 * 5] * NTHREADS)
|
|
|
|
def test_pattern_search(self):
|
|
"""Pattern search should work across threads."""
|
|
emails = ["alice@python.org", "bob@pycon.org"] * 10
|
|
pattern = re.compile(r"\w+@\w+\.\w+")
|
|
results = []
|
|
|
|
def worker():
|
|
matches = [pattern.search(e).group() for e in emails]
|
|
results.append(len(matches))
|
|
|
|
run_concurrently(worker_func=worker, nthreads=NTHREADS)
|
|
self.assertEqual(results, [2 * 10] * NTHREADS)
|
|
|
|
def test_scanner_concurrent_access(self):
|
|
"""Shared scanner should reject concurrent access."""
|
|
pattern = re.compile(r"\w+")
|
|
scanner = pattern.scanner("word " * 10)
|
|
|
|
def worker():
|
|
for _ in range(100):
|
|
try:
|
|
scanner.search()
|
|
except ValueError as e:
|
|
if "already executing" in str(e):
|
|
pass
|
|
else:
|
|
raise
|
|
|
|
run_concurrently(worker_func=worker, nthreads=NTHREADS)
|
|
# This test has no assertions. Its purpose is to catch crashes and
|
|
# enable thread sanitizer to detect race conditions. While "already
|
|
# executing" errors are very likely, they're not guaranteed due to
|
|
# non-deterministic thread scheduling, so we can't assert errors > 0.
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|