[Python-checkins] gh-101538: Add experimental wasi-threads build (#101537)

brettcannon webhook-mailer at python.org
Thu Jun 22 14:26:14 EDT 2023


https://github.com/python/cpython/commit/d8f87cdf94a6533c5cf2d25e09e6fa3eb06720b9
commit: d8f87cdf94a6533c5cf2d25e09e6fa3eb06720b9
branch: main
author: YAMAMOTO Takashi <yamamoto at midokura.com>
committer: brettcannon <brett at python.org>
date: 2023-06-22T11:26:10-07:00
summary:

gh-101538: Add experimental wasi-threads build (#101537)

Co-authored-by: Brett Cannon <brett at python.org>
Co-authored-by: Erlend E. Aasland <erlend.aasland at protonmail.com>

files:
A Misc/NEWS.d/next/Build/2023-02-03-21-36-42.gh-issue-101538.sF5F6S.rst
M Python/thread_pthread.h
M Tools/wasm/wasm_build.py
M configure
M configure.ac

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 0000000000000..4b83c303b3d2c
--- /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 76d6f3bcdf9c4..f96c57da64636 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 241a5d4eed5ae..c9947057a9075 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 b/configure
index fdc7c22531785..e33bf77779e6e 100755
--- a/configure
+++ b/configure
@@ -6874,7 +6874,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
@@ -7160,7 +7164,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
    ;;
@@ -9394,6 +9398,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 a24cd689730d7..8f097c4167759 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"])



More information about the Python-checkins mailing list