summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2023-10-11 00:57:53 (GMT)
committerGitHub <noreply@github.com>2023-10-11 00:57:53 (GMT)
commitf901f56313610389027cb4eae80d1d4b071aef69 (patch)
treec8502241e20460296678d288656b8d6d6d2fed66
parent7ca4aafa0ea94a4bb778b34e9c2e85b07f550c11 (diff)
downloadcpython-f901f56313610389027cb4eae80d1d4b071aef69.zip
cpython-f901f56313610389027cb4eae80d1d4b071aef69.tar.gz
cpython-f901f56313610389027cb4eae80d1d4b071aef69.tar.bz2
gh-110656: Fix logging test_post_fork_child_no_deadlock() if ASAN (#110657)
Skip test_post_fork_child_no_deadlock() if Python is built with ASAN. Add support.HAVE_ASAN_FORK_BUG.
-rw-r--r--Lib/test/_test_multiprocessing.py4
-rw-r--r--Lib/test/support/__init__.py4
-rw-r--r--Lib/test/test_logging.py8
-rw-r--r--Lib/test/test_threading.py9
4 files changed, 15 insertions, 10 deletions
diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py
index d3e7135..650fbad 100644
--- a/Lib/test/_test_multiprocessing.py
+++ b/Lib/test/_test_multiprocessing.py
@@ -78,10 +78,10 @@ except ImportError:
msvcrt = None
-if support.check_sanitizer(address=True):
+if support.HAVE_ASAN_FORK_BUG:
# gh-89363: Skip multiprocessing tests if Python is built with ASAN to
# work around a libasan race condition: dead lock in pthread_create().
- raise unittest.SkipTest("libasan has a pthread_create() dead lock")
+ raise unittest.SkipTest("libasan has a pthread_create() dead lock related to thread+fork")
def latin(s):
diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py
index 982d0df..21e8770 100644
--- a/Lib/test/support/__init__.py
+++ b/Lib/test/support/__init__.py
@@ -429,6 +429,10 @@ def skip_if_sanitizer(reason=None, *, address=False, memory=False, ub=False):
skip = check_sanitizer(address=address, memory=memory, ub=ub)
return unittest.skipIf(skip, reason)
+# gh-89363: True if fork() can hang if Python is built with Address Sanitizer
+# (ASAN): libasan race condition, dead lock in pthread_create().
+HAVE_ASAN_FORK_BUG = check_sanitizer(address=True)
+
def set_sanitizer_env_var(env, option):
for name in ('ASAN_OPTIONS', 'MSAN_OPTIONS', 'UBSAN_OPTIONS'):
diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py
index cca02a0..ab969ce 100644
--- a/Lib/test/test_logging.py
+++ b/Lib/test/test_logging.py
@@ -76,6 +76,13 @@ except ImportError:
pass
+# gh-89363: Skip fork() test if Python is built with Address Sanitizer (ASAN)
+# to work around a libasan race condition, dead lock in pthread_create().
+skip_if_asan_fork = unittest.skipIf(
+ support.HAVE_ASAN_FORK_BUG,
+ "libasan has a pthread_create() dead lock related to thread+fork")
+
+
class BaseTest(unittest.TestCase):
"""Base class for logging tests."""
@@ -724,6 +731,7 @@ class HandlerTest(BaseTest):
# register_at_fork mechanism is also present and used.
@support.requires_fork()
@threading_helper.requires_working_threading()
+ @skip_if_asan_fork
def test_post_fork_child_no_deadlock(self):
"""Ensure child logging locks are not held; bpo-6721 & bpo-36533."""
class _OurHandler(logging.Handler):
diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py
index f8b8194..00a6437 100644
--- a/Lib/test/test_threading.py
+++ b/Lib/test/test_threading.py
@@ -40,19 +40,12 @@ threading_helper.requires_working_threading(module=True)
platforms_to_skip = ('netbsd5', 'hp-ux11')
-# gh-89363: Skip fork() test if Python is built with Address Sanitizer (ASAN)
-# to work around a libasan race condition, dead lock in pthread_create().
-skip_if_asan_fork = support.skip_if_sanitizer(
- "libasan has a pthread_create() dead lock",
- address=True)
-
-
def skip_unless_reliable_fork(test):
if not support.has_fork_support:
return unittest.skip("requires working os.fork()")(test)
if sys.platform in platforms_to_skip:
return unittest.skip("due to known OS bug related to thread+fork")(test)
- if support.check_sanitizer(address=True):
+ if support.HAVE_ASAN_FORK_BUG:
return unittest.skip("libasan has a pthread_create() dead lock related to thread+fork")(test)
return test