]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-117478: Add `@support.requires_gil_enabled` decorator (#117479)
authorSam Gross <colesbury@gmail.com>
Thu, 4 Apr 2024 18:10:46 +0000 (14:10 -0400)
committerGitHub <noreply@github.com>
Thu, 4 Apr 2024 18:10:46 +0000 (14:10 -0400)
Co-authored-by: Kirill Podoprigora <kirill.bast9@mail.ru>
Doc/library/test.rst
Lib/test/support/__init__.py
Lib/test/test_capi/test_mem.py
Lib/test/test_cext/__init__.py
Lib/test/test_concurrent_futures/test_process_pool.py
Lib/test/test_concurrent_futures/test_thread_pool.py
Lib/test/test_gc.py

index 7d28f625345726360ec13c15ec9fa8205e4ef5a2..92d675b48690ffd98e96d852bedba60e5d6f448c 100644 (file)
@@ -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.
index d7bc416ab04086fccaa4e445dcd0709cf4c87f18..2be9cd099a68d621ae26495ff3eecd22da67aa10 100644 (file)
@@ -29,7 +29,7 @@ __all__ = [
     "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:
index 1958ecc0df4a7c43b78aef4b7c4464d4fa3d7807..296601e8ee4f5f74f17d19f2aa6282badc7d565f 100644 (file)
@@ -152,8 +152,8 @@ class PyMemDebugTests(unittest.TestCase):
             self.assertGreaterEqual(count, i*10-4)
 
 
-# Py_GIL_DISABLED requires mimalloc (not malloc)
-@unittest.skipIf(support.Py_GIL_DISABLED, 'need malloc')
+# free-threading requires mimalloc (not malloc)
+@support.requires_gil_enabled
 class PyMemMallocDebugTests(PyMemDebugTests):
     PYTHONMALLOC = 'malloc_debug'
 
index e4472b3355759c8cc5e19c5651ad38438b2c33a2..ec44b0ce1f8a56f7b8b3964bdf1423fdcf6347ce 100644 (file)
@@ -40,11 +40,11 @@ class TestExt(unittest.TestCase):
     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')
 
index e60e7a6607a997826e769d55689b6ef1f53302f8..8b1bdaa33d8f5c4e3eaaf3053bd407f288c9213f 100644 (file)
@@ -116,7 +116,7 @@ class ProcessPoolExecutorTest(ExecutorTest):
         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
index 86e65265516c3fda51e9e02ac33ee17db811c7ff..2b5bea9f4055a29c5a0e23677d52abf0e27d9ba6 100644 (file)
@@ -41,7 +41,7 @@ class ThreadPoolExecutorTest(ThreadPoolMixin, ExecutorTest, BaseTestCase):
             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()
index 3a01013b7710821528b60ddc95cccd5e6c9b617e..8a748cb55538e8560a61db7edd17794542fb2ea8 100644 (file)
@@ -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 @@ class GCTests(unittest.TestCase):
     # 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 @@ class GCTests(unittest.TestCase):
                 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 @@ class IncrementalGCTests(unittest.TestCase):
     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):