[3.12] gh-101538: Add experimental wasi-threads build (GH-101537) (#106834)

(cherry picked from commit d8f87cdf94)

Co-authored-by: YAMAMOTO Takashi <yamamoto@midokura.com>
Co-authored-by: Brett Cannon <brett@python.org>
Co-authored-by: Erlend E. Aasland <erlend.aasland@protonmail.com>
This commit is contained in:
Miss Islington (bot) 2023-07-17 15:31:17 -07:00 committed by GitHub
parent 941ac1e19d
commit e903c16a6c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 53 additions and 3 deletions

View file

@ -0,0 +1 @@
Add experimental wasi-threads support. Patch by Takashi Yamamoto.

View file

@ -356,7 +356,15 @@ PyThread_exit_thread(void)
{ {
if (!initialized) if (!initialized)
exit(0); 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); pthread_exit(0);
#endif
} }
#ifdef USE_SEMAPHORES #ifdef USE_SEMAPHORES

View file

@ -480,7 +480,6 @@ class BuildProfile:
cmd.append(f"--{opt}-wasm-dynamic-linking") cmd.append(f"--{opt}-wasm-dynamic-linking")
if self.pthreads is not None: if self.pthreads is not None:
assert self.host.is_emscripten
opt = "enable" if self.pthreads else "disable" opt = "enable" if self.pthreads else "disable"
cmd.append(f"--{opt}-wasm-pthreads") cmd.append(f"--{opt}-wasm-pthreads")
@ -745,6 +744,13 @@ _profiles = [
support_level=SupportLevel.supported, support_level=SupportLevel.supported,
host=Host.wasm32_wasi, host=Host.wasm32_wasi,
), ),
# wasm32-wasi-threads
BuildProfile(
"wasi-threads",
support_level=SupportLevel.experimental,
host=Host.wasm32_wasi,
pthreads=True,
),
# no SDK available yet # no SDK available yet
# BuildProfile( # BuildProfile(
# "wasm64-wasi", # "wasm64-wasi",

21
configure generated vendored
View file

@ -6899,7 +6899,11 @@ cat > conftest.c <<EOF
# if defined(__EMSCRIPTEN__) # if defined(__EMSCRIPTEN__)
wasm32-emscripten wasm32-emscripten
# elif defined(__wasi__) # elif defined(__wasi__)
# if defined(_REENTRANT)
wasm32-wasi-threads
# else
wasm32-wasi wasm32-wasi
# endif
# else # else
# error unknown wasm32 platform # error unknown wasm32 platform
# endif # endif
@ -7185,7 +7189,7 @@ then :
Emscripten) : Emscripten) :
;; #( ;; #(
WASI) : 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 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" LIBS="$LIBS -lwasi-emulated-signal -lwasi-emulated-getpid -lwasi-emulated-process-clocks"
echo "#define _WASI_EMULATED_SIGNAL 1" >> confdefs.h 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" as_fn_append LDFLAGS_NODIST " -z stack-size=524288 -Wl,--stack-first -Wl,--initial-memory=10485760"
;; #( ;; #(

View file

@ -1079,7 +1079,11 @@ cat > conftest.c <<EOF
# if defined(__EMSCRIPTEN__) # if defined(__EMSCRIPTEN__)
wasm32-emscripten wasm32-emscripten
# elif defined(__wasi__) # elif defined(__wasi__)
# if defined(_REENTRANT)
wasm32-wasi-threads
# else
wasm32-wasi wasm32-wasi
# endif
# else # else
# error unknown wasm32 platform # error unknown wasm32 platform
# endif # endif
@ -1272,7 +1276,7 @@ AC_ARG_ENABLE([wasm-pthreads],
[ [
AS_CASE([$ac_sys_system], AS_CASE([$ac_sys_system],
[Emscripten], [], [Emscripten], [],
[WASI], [AC_MSG_ERROR([WASI threading is not implemented yet.])], [WASI], [],
[AC_MSG_ERROR([--enable-wasm-pthreads only applies to Emscripten and 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" LIBS="$LIBS -lwasi-emulated-signal -lwasi-emulated-getpid -lwasi-emulated-process-clocks"
echo "#define _WASI_EMULATED_SIGNAL 1" >> confdefs.h 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 increase initial memory and stack size, move stack first
dnl https://github.com/WebAssembly/wasi-libc/issues/233 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"]) AS_VAR_APPEND([LDFLAGS_NODIST], [" -z stack-size=524288 -Wl,--stack-first -Wl,--initial-memory=10485760"])