bpo-40280: Detect if WASM platform supports threading (GH-32243)

Automerge-Triggered-By: GH:tiran
This commit is contained in:
Christian Heimes 2022-04-02 11:12:44 +03:00 committed by GitHub
parent 7000cd7016
commit 59be9cd748
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 1 deletions

View File

@ -11,6 +11,7 @@ import unittest
from test import support from test import support
from test.support import os_helper from test.support import os_helper
from test.support import threading_helper
from test.libregrtest.cmdline import Namespace from test.libregrtest.cmdline import Namespace
from test.libregrtest.save_env import saved_test_environment from test.libregrtest.save_env import saved_test_environment
from test.libregrtest.utils import clear_caches, format_duration, print_warning 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 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: if use_timeout:
faulthandler.dump_traceback_later(ns.timeout, exit=True) faulthandler.dump_traceback_later(ns.timeout, exit=True)

View File

@ -207,3 +207,30 @@ class catch_threading_exception:
del self.exc_value del self.exc_value
del self.exc_traceback del self.exc_traceback
del self.thread 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()