| import sys | |
| import unittest | |
| from test.support import threading_helper | |
| class SysModuleTest(unittest.TestCase): | |
| @unittest.skipUnless(hasattr(sys, "setdlopenflags"), | |
| "test needs sys.setdlopenflags()") | |
| def test_dlopenflags_concurrent(self): | |
| # gh-151644: getdlopenflags() and setdlopenflags() must be safe to | |
| # call concurrently in free-threaded builds. | |
| original = sys.getdlopenflags() | |
| self.addCleanup(sys.setdlopenflags, original) | |
| # Use a small set of known-valid flag values to avoid integer overflow. | |
| flag_values = [1, 2, 256, 257] | |
| def worker(worker_id): | |
| for i in range(20_000): | |
| if worker_id % 2 == 0: | |
| sys.getdlopenflags() | |
| else: | |
| sys.setdlopenflags(flag_values[worker_id % len(flag_values)]) | |
| workers = [lambda i=i: worker(i) for i in range(6)] | |
| threading_helper.run_concurrently(workers) | |
| def test_int_max_str_digits_thread(self): | |
| # gh-151218: Check that it's safe to call get_int_max_str_digits() and | |
| # set_int_max_str_digits() in parallel. Previously, this test triggered | |
| # warnings in TSan on a free threaded build. | |
| old_limit = sys.get_int_max_str_digits() | |
| self.addCleanup(sys.set_int_max_str_digits, old_limit) | |
| def worker(worker_id): | |
| if not worker_id: | |
| for i in range (20_000): | |
| sys.get_int_max_str_digits() | |
| else: | |
| for i in range (20_000): | |
| sys.set_int_max_str_digits(4300 + (i & 7)) | |
| workers = [lambda: worker(i) for i in range(5)] | |
| threading_helper.run_concurrently(workers) | |
| if __name__ == "__main__": | |
| unittest.main() |