https://github.com/python/cpython/commit/42205143f8b3211d1392f1d9f2cf6717bdaa5b47 commit: 42205143f8b3211d1392f1d9f2cf6717bdaa5b47 branch: main author: Sam Gross <[email protected]> committer: colesbury <[email protected]> date: 2024-04-04T14:10:46-04:00 summary:
gh-117478: Add `@support.requires_gil_enabled` decorator (#117479) Co-authored-by: Kirill Podoprigora <[email protected]> files: M Doc/library/test.rst M Lib/test/support/__init__.py M Lib/test/test_capi/test_mem.py M Lib/test/test_cext/__init__.py M Lib/test/test_concurrent_futures/test_process_pool.py M Lib/test/test_concurrent_futures/test_thread_pool.py M Lib/test/test_gc.py diff --git a/Doc/library/test.rst b/Doc/library/test.rst index 7d28f625345726..92d675b48690ff 100644 --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -731,6 +731,12 @@ The :mod:`test.support` module defines the following functions: macOS version is less than the minimum, the test is skipped. +.. decorator:: requires_gil_enabled + + Decorator for skipping tests on the free-threaded build. If the + :term:`GIL` is disabled, the test is skipped. + + .. decorator:: requires_IEEE_754 Decorator for skipping tests on non-IEEE 754 platforms. diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index d7bc416ab04086..2be9cd099a68d6 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -29,7 +29,7 @@ "captured_stdin", "captured_stderr", # unittest "is_resource_enabled", "requires", "requires_freebsd_version", - "requires_linux_version", "requires_mac_ver", + "requires_gil_enabled", "requires_linux_version", "requires_mac_ver", "check_syntax_error", "requires_gzip", "requires_bz2", "requires_lzma", "bigmemtest", "bigaddrspacetest", "cpython_only", "get_attribute", @@ -837,6 +837,11 @@ def check_cflags_pgo(): Py_GIL_DISABLED = bool(sysconfig.get_config_var('Py_GIL_DISABLED')) + +def requires_gil_enabled(msg="needs the GIL enabled"): + """Decorator for skipping tests on the free-threaded build.""" + return unittest.skipIf(Py_GIL_DISABLED, msg) + if Py_GIL_DISABLED: _header = 'PHBBInP' else: diff --git a/Lib/test/test_capi/test_mem.py b/Lib/test/test_capi/test_mem.py index 1958ecc0df4a7c..296601e8ee4f5f 100644 --- a/Lib/test/test_capi/test_mem.py +++ b/Lib/test/test_capi/test_mem.py @@ -152,8 +152,8 @@ class C(): pass self.assertGreaterEqual(count, i*10-4) -# Py_GIL_DISABLED requires mimalloc (not malloc) [email protected](support.Py_GIL_DISABLED, 'need malloc') +# free-threading requires mimalloc (not malloc) [email protected]_gil_enabled class PyMemMallocDebugTests(PyMemDebugTests): PYTHONMALLOC = 'malloc_debug' diff --git a/Lib/test/test_cext/__init__.py b/Lib/test/test_cext/__init__.py index e4472b3355759c..ec44b0ce1f8a56 100644 --- a/Lib/test/test_cext/__init__.py +++ b/Lib/test/test_cext/__init__.py @@ -40,11 +40,11 @@ def test_build_c11(self): def test_build_c99(self): self.check_build('_test_c99_cext', std='c99') - @unittest.skipIf(support.Py_GIL_DISABLED, 'incompatible with Free Threading') + @support.requires_gil_enabled('incompatible with Free Threading') def test_build_limited(self): self.check_build('_test_limited_cext', limited=True) - @unittest.skipIf(support.Py_GIL_DISABLED, 'broken for now with Free Threading') + @support.requires_gil_enabled('broken for now with Free Threading') def test_build_limited_c11(self): self.check_build('_test_limited_c11_cext', limited=True, std='c11') diff --git a/Lib/test/test_concurrent_futures/test_process_pool.py b/Lib/test/test_concurrent_futures/test_process_pool.py index e60e7a6607a997..8b1bdaa33d8f5c 100644 --- a/Lib/test/test_concurrent_futures/test_process_pool.py +++ b/Lib/test/test_concurrent_futures/test_process_pool.py @@ -116,7 +116,7 @@ def test_saturation(self): for _ in range(job_count): sem.release() - @unittest.skipIf(support.Py_GIL_DISABLED, "gh-117344: test is flaky without the GIL") + @support.requires_gil_enabled("gh-117344: test is flaky without the GIL") def test_idle_process_reuse_one(self): executor = self.executor assert executor._max_workers >= 4 diff --git a/Lib/test/test_concurrent_futures/test_thread_pool.py b/Lib/test/test_concurrent_futures/test_thread_pool.py index 86e65265516c3f..2b5bea9f4055a2 100644 --- a/Lib/test/test_concurrent_futures/test_thread_pool.py +++ b/Lib/test/test_concurrent_futures/test_thread_pool.py @@ -41,7 +41,7 @@ def acquire_lock(lock): sem.release() executor.shutdown(wait=True) - @unittest.skipIf(support.Py_GIL_DISABLED, "gh-117344: test is flaky without the GIL") + @support.requires_gil_enabled("gh-117344: test is flaky without the GIL") def test_idle_thread_reuse(self): executor = self.executor_type() executor.submit(mul, 21, 2).result() diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py index 3a01013b771082..8a748cb55538e8 100644 --- a/Lib/test/test_gc.py +++ b/Lib/test/test_gc.py @@ -1,7 +1,8 @@ import unittest import unittest.mock from test.support import (verbose, refcount_test, - cpython_only, requires_subprocess, Py_GIL_DISABLED) + cpython_only, requires_subprocess, + requires_gil_enabled) from test.support.import_helper import import_module from test.support.os_helper import temp_dir, TESTFN, unlink from test.support.script_helper import assert_python_ok, make_script @@ -362,7 +363,7 @@ def __del__(self): # To minimize variations, though, we first store the get_count() results # and check them at the end. @refcount_test - @unittest.skipIf(Py_GIL_DISABLED, 'needs precise allocation counts') + @requires_gil_enabled('needs precise allocation counts') def test_get_count(self): gc.collect() a, b, c = gc.get_count() @@ -815,7 +816,7 @@ def test_get_objects(self): any(l is element for element in gc.get_objects()) ) - @unittest.skipIf(Py_GIL_DISABLED, 'need generational GC') + @requires_gil_enabled('need generational GC') def test_get_objects_generations(self): gc.collect() l = [] @@ -1046,7 +1047,7 @@ def setUp(self): def tearDown(self): gc.disable() - @unittest.skipIf(Py_GIL_DISABLED, "Free threading does not support incremental GC") + @requires_gil_enabled("Free threading does not support incremental GC") # Use small increments to emulate longer running process in a shorter time @gc_threshold(200, 10) def test_incremental_gc_handles_fast_cycle_creation(self): _______________________________________________ Python-checkins mailing list -- [email protected] To unsubscribe send an email to [email protected] https://mail.python.org/mailman3/lists/python-checkins.python.org/ Member address: [email protected]
