]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-40280: Detect if WASM platform supports threading (GH-32243)
authorChristian Heimes <christian@python.org>
Sat, 2 Apr 2022 08:12:44 +0000 (11:12 +0300)
committerGitHub <noreply@github.com>
Sat, 2 Apr 2022 08:12:44 +0000 (01:12 -0700)
Automerge-Triggered-By: GH:tiran
Lib/test/libregrtest/runtest.py
Lib/test/support/threading_helper.py

index 83c5f249841ccc717cf99d97accbfbec8b09644f..62cf1a3f1175eeb4204a8aa0681bb258243a54e0 100644 (file)
@@ -11,6 +11,7 @@ import unittest
 
 from test import support
 from test.support import os_helper
+from test.support import threading_helper
 from test.libregrtest.cmdline import Namespace
 from test.libregrtest.save_env import saved_test_environment
 from test.libregrtest.utils import clear_caches, format_duration, print_warning
@@ -179,7 +180,9 @@ def _runtest(ns: Namespace, test_name: str) -> TestResult:
 
     output_on_failure = ns.verbose3
 
-    use_timeout = (ns.timeout is not None)
+    use_timeout = (
+        ns.timeout is not None and threading_helper.can_start_thread
+    )
     if use_timeout:
         faulthandler.dump_traceback_later(ns.timeout, exit=True)
 
index 92a64e8354acbce5aa0762a2b84c6552103c7269..2ae4577f41f7be8abbff469d33a58f2fd6660aba 100644 (file)
@@ -207,3 +207,30 @@ class catch_threading_exception:
         del self.exc_value
         del self.exc_traceback
         del self.thread
+
+
+def _can_start_thread() -> bool:
+    """Detect if Python can start new threads.
+
+    Some WebAssembly platforms do not provide a working pthread
+    implementation. Thread support is stubbed and any attempt
+    to create a new thread fails.
+
+    - wasm32-wasi does not have threading.
+    - wasm32-emscripten can be compiled with or without pthread
+      support (-s USE_PTHREADS / __EMSCRIPTEN_PTHREADS__).
+    """
+    if sys.platform == "emscripten":
+        try:
+            _thread.start_new_thread(lambda: None, ())
+        except RuntimeError:
+            return False
+        else:
+            return True
+    elif sys.platform == "wasi":
+        return False
+    else:
+        # assume all other platforms have working thread support.
+        return True
+
+can_start_thread = _can_start_thread()