summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Misc/NEWS.d/next/Build/2023-02-03-21-36-42.gh-issue-101538.sF5F6S.rst1
-rw-r--r--Python/thread_pthread.h8
-rwxr-xr-xTools/wasm/wasm_build.py8
-rwxr-xr-xconfigure21
-rw-r--r--configure.ac18
5 files changed, 53 insertions, 3 deletions
diff --git a/Misc/NEWS.d/next/Build/2023-02-03-21-36-42.gh-issue-101538.sF5F6S.rst b/Misc/NEWS.d/next/Build/2023-02-03-21-36-42.gh-issue-101538.sF5F6S.rst
new file mode 100644
index 0000000..4b83c30
--- /dev/null
+++ b/Misc/NEWS.d/next/Build/2023-02-03-21-36-42.gh-issue-101538.sF5F6S.rst
@@ -0,0 +1 @@
+Add experimental wasi-threads support. Patch by Takashi Yamamoto.
diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h
index 76d6f3b..f96c57d 100644
--- a/Python/thread_pthread.h
+++ b/Python/thread_pthread.h
@@ -356,7 +356,15 @@ PyThread_exit_thread(void)
{
if (!initialized)
exit(0);
+#if defined(__wasi__)
+ /*
+ * wasi-threads doesn't have pthread_exit right now
+ * cf. https://github.com/WebAssembly/wasi-threads/issues/7
+ */
+ abort();
+#else
pthread_exit(0);
+#endif
}
#ifdef USE_SEMAPHORES
diff --git a/Tools/wasm/wasm_build.py b/Tools/wasm/wasm_build.py
index 241a5d4..c994705 100755
--- a/Tools/wasm/wasm_build.py
+++ b/Tools/wasm/wasm_build.py
@@ -480,7 +480,6 @@ class BuildProfile:
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 @@ _profiles = [
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 b/configure
index 248b14e..91bf1d2 100755
--- a/configure
+++ b/configure
@@ -6899,7 +6899,11 @@ cat > conftest.c <<EOF
# if defined(__EMSCRIPTEN__)
wasm32-emscripten
# elif defined(__wasi__)
+# if defined(_REENTRANT)
+ wasm32-wasi-threads
+# else
wasm32-wasi
+# endif
# else
# error unknown wasm32 platform
# endif
@@ -7185,7 +7189,7 @@ then :
Emscripten) :
;; #(
WASI) :
- as_fn_error $? "WASI threading is not implemented yet." "$LINENO" 5 ;; #(
+ ;; #(
*) :
as_fn_error $? "--enable-wasm-pthreads only applies to Emscripten and WASI" "$LINENO" 5
;;
@@ -9419,6 +9423,21 @@ printf "%s\n" "#define _WASI_EMULATED_PROCESS_CLOCKS 1" >>confdefs.h
LIBS="$LIBS -lwasi-emulated-signal -lwasi-emulated-getpid -lwasi-emulated-process-clocks"
echo "#define _WASI_EMULATED_SIGNAL 1" >> confdefs.h
+ if test "x$enable_wasm_pthreads" = xyes
+then :
+
+ # Note: update CFLAGS because ac_compile/ac_link needs this too.
+ # without this, configure fails to find pthread_create, sem_init,
+ # etc because they are only available in the sysroot for
+ # wasm32-wasi-threads.
+ as_fn_append CFLAGS " -target wasm32-wasi-threads -pthread"
+ as_fn_append CFLAGS_NODIST " -target wasm32-wasi-threads -pthread"
+ as_fn_append LDFLAGS_NODIST " -target wasm32-wasi-threads -pthread"
+ as_fn_append LDFLAGS_NODIST " -Wl,--import-memory"
+ as_fn_append LDFLAGS_NODIST " -Wl,--max-memory=10485760"
+
+fi
+
as_fn_append LDFLAGS_NODIST " -z stack-size=524288 -Wl,--stack-first -Wl,--initial-memory=10485760"
;; #(
diff --git a/configure.ac b/configure.ac
index 96c96e4..0770f68 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1079,7 +1079,11 @@ cat > conftest.c <<EOF
# if defined(__EMSCRIPTEN__)
wasm32-emscripten
# elif defined(__wasi__)
+# if defined(_REENTRANT)
+ wasm32-wasi-threads
+# else
wasm32-wasi
+# endif
# else
# error unknown wasm32 platform
# endif
@@ -1272,7 +1276,7 @@ AC_ARG_ENABLE([wasm-pthreads],
[
AS_CASE([$ac_sys_system],
[Emscripten], [],
- [WASI], [AC_MSG_ERROR([WASI threading is not implemented yet.])],
+ [WASI], [],
[AC_MSG_ERROR([--enable-wasm-pthreads only applies to Emscripten and WASI])]
)
], [
@@ -2309,6 +2313,18 @@ AS_CASE([$ac_sys_system],
LIBS="$LIBS -lwasi-emulated-signal -lwasi-emulated-getpid -lwasi-emulated-process-clocks"
echo "#define _WASI_EMULATED_SIGNAL 1" >> confdefs.h
+ AS_VAR_IF([enable_wasm_pthreads], [yes], [
+ # Note: update CFLAGS because ac_compile/ac_link needs this too.
+ # without this, configure fails to find pthread_create, sem_init,
+ # etc because they are only available in the sysroot for
+ # wasm32-wasi-threads.
+ AS_VAR_APPEND([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"])