-
Notifications
You must be signed in to change notification settings - Fork 208
Description
Now that WebAssembly/wasi-libc#518 has been merged thanks to the excellent work by @ArcaneNibble, we have pthread.h
exist dormantly in single-threaded builds, only triggering an assertion if someone was using a function like pthread_create
which is definitely missing. However, the original point of that PR was to enable the use of <atomic>
, <mutex>
, and other such headers in single-threaded WASI targets.
Libc++ can be built in single-threaded or multi-threaded mode, which changes a #define
it embeds in a header, and also changes code generated for libc++.{a,so}
. This is a problem given the direction chosen for handling pthread.h
: right now, if I adjust the wasi-sdk build scripts to enable multi-threaded mode at all times, it becomes impossible to build any C++ code without also passing in -D_WASI_EMULATED_PTHREAD
. This is obviously not a feasible way forward.
I can see three potential paths forward here:
- Add a target variant, let's say
wasm32-wasi-emuthreads
, that has libc++ compiled in the multi-threaded mode and linked with the emulated pthreads library. - Ship a multi-threaded libc++ with the existing
wasm32-wasi
target, but modify the pthread integration code such that-D_WASI_EMULATED_PTHREAD
isn't needed to build code that only needs e.g.<optional>
but not<atomic>
. This would involve extensive hacking at libc++ because right now e.g.<optional>
depends on<atomic>
(and many other seemingly non-threading-related headers depend, transitively, on pthreads functions). - Give up. Applications like Clang or Slang (a SystemVerilog frontend in C++) will not be buildable with upstream WASI SDK for single-threaded targets, limiting their deployability. I will likely switch to using my fork of the SDK and start to recommend it to anyone porting complex C++ applications.
To me, (2) seems not really a feasible solution given the resource constraints in practice, but I can also see that (1) may be viewed as objectionable. I could put in some effort towards implementing either (I'm halfway through solution 1) but I would like clear guidance from the upstream first.