From fb625af2d4aff1c9881f1334b0a3c990e3f1471f Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Fri, 3 Feb 2023 21:05:21 +0900 Subject: [PATCH] Add experimental wasi-threads build eg. ``` autoconf export WASI_SDK_PATH=/opt/wasi-sdk-19.5g0236e959edbc ./Tools/wasm/wasm_build.py wasi-threads build ~/git/toywasm/b.thread/toywasm --wasi --wasi-dir . --wasi-dir ~/git/garbage/py/th2 -- builddir/wasi-threads/python.wasm ~/git/garbage/py/th2/thread.py `` * I used an unreleased version of wasi-sdk * I used toywasm to test because wasmtime doesn't have necessary functionality yet. --- Python/thread_pthread.h | 7 +++++++ Tools/wasm/config.site-wasm32-wasi | 2 ++ Tools/wasm/wasm_build.py | 8 +++++++- configure.ac | 15 ++++++++++++++- 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index 76d6f3bcdf9c407..540d3bceb19b9c4 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -356,7 +356,14 @@ PyThread_exit_thread(void) { if (!initialized) exit(0); +#if defined(__wasi__) + /* + * wasi-threads doesn't have pthread_exit right now + */ + abort(); +#else pthread_exit(0); +#endif } #ifdef USE_SEMAPHORES diff --git a/Tools/wasm/config.site-wasm32-wasi b/Tools/wasm/config.site-wasm32-wasi index 5e98775400f6ead..065a7f3baed8b04 100644 --- a/Tools/wasm/config.site-wasm32-wasi +++ b/Tools/wasm/config.site-wasm32-wasi @@ -40,3 +40,5 @@ ac_cv_header_netpacket_packet_h=no # Disable int-conversion for wask-sdk as it triggers an error from version 17. ac_cv_disable_int_conversion=yes + +ac_cv_pthread=yes diff --git a/Tools/wasm/wasm_build.py b/Tools/wasm/wasm_build.py index 493682c5b138a3d..4a37ec20895ee18 100755 --- a/Tools/wasm/wasm_build.py +++ b/Tools/wasm/wasm_build.py @@ -480,7 +480,6 @@ def configure_cmd(self) -> List[str]: cmd.append(f"--{opt}-wasm-dynamic-linking") if self.pthreads is not None: - assert self.host.is_emscripten opt = "enable" if self.pthreads else "disable" cmd.append(f"--{opt}-wasm-pthreads") @@ -745,6 +744,13 @@ def build_emports(self, force: bool = False): support_level=SupportLevel.supported, host=Host.wasm32_wasi, ), + # wasm32-wasi-threads + BuildProfile( + "wasi-threads", + support_level=SupportLevel.experimental, + host=Host.wasm32_wasi, + pthreads=True, + ), # no SDK available yet # BuildProfile( # "wasm64-wasi", diff --git a/configure.ac b/configure.ac index 5eee4586680dbbe..4e0717fbcea7f8f 100644 --- a/configure.ac +++ b/configure.ac @@ -1053,7 +1053,11 @@ cat > conftest.c <> confdefs.h + AS_VAR_IF([enable_wasm_pthreads], [yes], [ + # Note: update CFLAGS because ac_compile/ac_link needs this too + CFLAGS="$CFLAGS -target wasm32-wasi-threads -pthread" + AS_VAR_APPEND([CFLAGS_NODIST], [" -target wasm32-wasi-threads -pthread"]) + AS_VAR_APPEND([LDFLAGS_NODIST], [" -target wasm32-wasi-threads -pthread"]) + AS_VAR_APPEND([LDFLAGS_NODIST], [" -Wl,--import-memory"]) + AS_VAR_APPEND([LDFLAGS_NODIST], [" -Wl,--max-memory=10485760"]) + ]) + dnl increase initial memory and stack size, move stack first dnl https://github.com/WebAssembly/wasi-libc/issues/233 AS_VAR_APPEND([LDFLAGS_NODIST], [" -z stack-size=524288 -Wl,--stack-first -Wl,--initial-memory=10485760"])