diff --git a/Lib/test/support/threading_helper.py b/Lib/test/support/threading_helper.py index cf87233f0e2e938..31be31ac9a9dad8 100644 --- a/Lib/test/support/threading_helper.py +++ b/Lib/test/support/threading_helper.py @@ -1,6 +1,7 @@ import _thread import contextlib import functools +import inspect import sys import threading import time @@ -59,6 +60,11 @@ def reap_threads(func): """Use this function when threads are being used. This will ensure that the threads are cleaned up even when the test fails. """ + + if inspect.isclass(func): + # It should be used on each test method, not on the whole class + raise ValueError("@reap_threads is not compatible with classes") + @functools.wraps(func) def decorator(*args): key = threading_setup() diff --git a/Lib/test/test_free_threading/test_json.py b/Lib/test/test_free_threading/test_json.py index 010eb322a15b844..7e3adcf0e81ae22 100644 --- a/Lib/test/test_free_threading/test_json.py +++ b/Lib/test/test_free_threading/test_json.py @@ -29,12 +29,12 @@ def items(self): return self.mapping -@threading_helper.reap_threads @threading_helper.requires_working_threading() class TestJsonEncoding(CTest): # Test encoding json with concurrent threads modifying the data cannot # corrupt the interpreter + @threading_helper.reap_threads def test_json_mutating_list(self): def worker(barrier, data, index): barrier.wait() @@ -48,6 +48,7 @@ def worker(barrier, data, index): data = [[], []] encode_json_helper(self.json, worker, data) + @threading_helper.reap_threads def test_json_mutating_exact_dict(self): def worker(barrier, data, index): barrier.wait() @@ -65,6 +66,7 @@ def worker(barrier, data, index): data = [{}, {}] encode_json_helper(self.json, worker, data) + @threading_helper.reap_threads def test_json_mutating_mapping(self): def worker(barrier, data, index): barrier.wait()