forked from dotnet/runtimelab
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
support
System.Net.Http.HttpClient
on WASIp2
This adds `WasiHttpHandler`, a new implementation of `HttpMessageHandler` based on [wasi:http/outgoing-handler](https://github.com/WebAssembly/wasi-http/blob/v0.2.0/wit/handler.wit), plus tweaks to `System.Threading` to allow async `Task`s to work in a single-threaded context, with `ThreadPool` work items dispatched from an application-provided event loop. WASIp2 supports asynchronous I/O and timers via `wasi:io/poll/pollable` resource handles. One or more of those handles may be passed to `wasi:io/poll/poll`, which will block until at least one of them is ready. In order to make this model play nice with C#'s `async`/`await` and `Task` features, we need to reconcile several constraints: - WASI is currently single-threaded, and will continue to be that way for a while. - C#'s `async`/`await` and `Task` features require a working `ThreadPool` implementation capable of deferring work. - A WASI component can export an arbitrary number of functions to the host, and though they will always be called synchronously from the host, they need to be able to perform asynchronous operations before returning. - WASIp3 (currently in the design and prototype phase) will support asynchronous exports, with the top level event loop running in the host instead of the guest, and `wasi:io/poll/pollable` will no longer exist. Therefore, we don't want to add any temporary public APIs to the .NET runtime which will become obsolete when WASIp3 arrives. The solution we arrived at looks something like this: - Tweak the existing `ThreadPool` implementation for WASI so that methods such as `RequestWorkerThread` don't throw `PlatformNotSupportedException`s (i.e. allow work items to be queued even though the "worker thread" is always the same one that is queuing the work) - Add two new methods to `Thread`: - `internal static void Dispatch`: Runs an iteration of event loop, draining the `ThreadPool` queue of ready work items and calling `wasi:io/poll/poll` with any accumulated `pollable` handles - `internal static Task Register(int pollableHandle)`: Registers the specified `pollable` handle to be `poll`ed during the next call to `Dispatch` - Note that these methods are `internal` because they're temporary and should not be part of the public API, but they are intended to be called via `UnsafeAccessor` by application code (or more precisely, code generated by `wit-bindgen` for the application) The upshot is that application code can use `wit-bindgen` (either directly or via the new `componentize-dotnet` package) to generate async export bindings which will provide an event loop backed by `Thread.Dispatch`. Additionally, `wit-bindgen` can transparently convert any `pollable` handles returned by WASI imports into `Task`s via `Thread.Register`, allowing the component to `await` them, pass them to a combinator such as `Task.WhenEach`, etc. Later, when WASIp3 arrives and we update the .NET runtime to target it, we'll be able to remove some of this code (and the corresponding code in `wit-bindgen`) without requiring significant changes to the application developer's experience. This PR contains a few C# source files that were generated by `wit-bindgen` from the official WASI WIT files, plus scripts to regenerate them if desired. Signed-off-by: Joel Dice <[email protected]> switch to `wasm32-wasip2` and update WASI test infra Now that we're using WASI-SDK 22, we can target `wasm32-wasip2`, which produces components by default and includes full `wasi:sockets` support. In order to run those components, I've updated the test infrastructure to use Wasmtime 21 (the latest release as of this writing). Other changes of note: - Tweaked src/coreclr/jit/compiler.cpp to make `Debug` builds work on Linux - Added libWasiHttp.a, which includes the encoded component type (in the form of a pre-generated Wasm object file) and a `cabi_realloc` definition. Both of these are generated by `wit-bindgen` and required by `wasm-component-ld` to generate a valid component. - Added a `FindWasmHostExecutableAndRun.sh` script for running the WASI tests on UNIX-style platforms. Signed-off-by: Joel Dice <[email protected]> various WASI build tweaks Signed-off-by: Joel Dice <[email protected]> quote libWasiHttp.a path in custom linker arg Signed-off-by: Joel Dice <[email protected]> fix wasm-component-ld download command Signed-off-by: Joel Dice <[email protected]> tweak EmccExtraArgs in CustomMain.csproj so wasm-component-ld understands it Signed-off-by: Joel Dice <[email protected]> update CMake minimum version in wasi-sdk-p2.cmake Signed-off-by: Joel Dice <[email protected]> use `HeaderDescriptor` to sort content and response headers Signed-off-by: Joel Dice <[email protected]> allow building native WASI test code in src/tests/build.sh Signed-off-by: Joel Dice <[email protected]> allow WASI runtime tests to be built and run on non-Windows systems Signed-off-by: Joel Dice <[email protected]> update runtime tests to work with WASIp2 As of this writing, WASIp2 [does not support process exit statuses](WebAssembly/wasi-cli#11) beyond 0 (success) and 1 (failure). To work around this, I've modified the relevant tests to return 0 on success instead of 100. Signed-off-by: Joel Dice <[email protected]> fix CI for Windows builds; remove unused file Signed-off-by: Joel Dice <[email protected]> disable sprintf warning in llvmlssa.cpp on macOS Signed-off-by: Joel Dice <[email protected]> remove LibraryWorld_cabi_realloc.o I didn't mean to add this to Git. Signed-off-by: Joel Dice <[email protected]> rename `generate-bindings.sh` files for clarity This makes it more obvious that, though they are similar, they each have a different job. Signed-off-by: Joel Dice <[email protected]> update to `wit-bindgen` 0.27.0 and regenerate bindings Signed-off-by: Joel Dice <[email protected]> reorganize code; add HttpClient smoke test - move System/WASIp2 to System/Threading/WASIp2 - remove generated `cabi_realloc` functions since `wasi-libc` will provide one - add HttpClient test to SmokeTests/SharedLibrary Note that I put the HttpClient test in SmokeTests/SharedLibrary since we were already using NodeJS for that test, and adding a simple loopback webserver to SharedLibraryDriver.mjs was easiest option available to keep the whole test self-contained. Signed-off-by: Joel Dice <[email protected]> implement SystemNative_SysLog for WASI Signed-off-by: Joel Dice <[email protected]> increase NodeJS stack trace limit to 200 Signed-off-by: Joel Dice <[email protected]> give guest no filesystem access in SharedLibraryDriver.mjs Signed-off-by: Joel Dice <[email protected]> switch to Trace.Assert into HttpClient smoke test Signed-off-by: Joel Dice <[email protected]> rename WASIp2 directory to Wasi Signed-off-by: Joel Dice <[email protected]> fix non-GET methods and add HttpClient echo test Signed-off-by: Joel Dice <[email protected]> use azure NPM rename - WasiEventLoop.RegisterWasiPollable - WasiEventLoop.DispatchWasiEventLoop to make it less confusing on the Thread class - unification of gen-buildsys - cleanup pal_process_wasi.c fix build? more buffer /echo request body in SharedLibraryDriver.mjs Signed-off-by: Joel Dice <[email protected]> fix gen-buildsys.sh regression Signed-off-by: Joel Dice <[email protected]> allow only infinite `HttpClient.Timeout`s on WASI This temporary code will be reverted once we support `System.Threading.Timer` on WASI in a forthcoming PR. Signed-off-by: Joel Dice <[email protected]> use `&` operator to simplify install-jco.ps1 Signed-off-by: Joel Dice <[email protected]> remove redundant `CheckWasmSdks` target from SharedLibrary.csproj Signed-off-by: Joel Dice <[email protected]> split `FindWasmHostExecutable.sh` out of `FindWasmHostExecutableAndRun.sh` Signed-off-by: Joel Dice <[email protected]> replace component type object files with WIT files This updates `wit-bindgen` and `wasm-component-ld`, which now support producing and consuming component type WIT files as an alternative to binary object files. These files are easier to audit from a security perspective. Signed-off-by: Joel Dice <[email protected]> preserve slashes in path in SharedLibrary.csproj Signed-off-by: Joel Dice <[email protected]>
- Loading branch information
Showing
87 changed files
with
11,493 additions
and
112 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -34,7 +34,9 @@ For the runtime libraries: | |
./emsdk install 3.1.47 | ||
./emsdk activate 3.1.47 | ||
``` | ||
- To build for WASI, download and install WASI-SDK 22 from https://github.com/WebAssembly/wasi-sdk/releases (only Windows and Linux are supported currently) and set the `WASI_SDK_PATH` environment variable to the location where it is installed, e.g. `set WASI_SDK_PATH=c:\github\wasi-sdk`. Note that WASI-SDK 22 only includes a copy of `pthread.h` for the `wasm32-wasi-threads` target, which we must copy to the include directory for the `wasm32-wasi` target, e.g. `cp $WASI_SDK\share\wasi-sysroot\include\wasm32-wasi-threads\pthread.h $WASI_SDK\share\wasi-sysroot\include\wasm32-wasi\`. This is a temporary workaround until https://github.com/WebAssembly/wasi-libc/issues/501 has been addressed and released. | ||
- To build for WASI, download and install WASI-SDK 22 from https://github.com/WebAssembly/wasi-sdk/releases (only Windows and Linux are supported currently) and set the `WASI_SDK_PATH` environment variable to the location where it is installed, e.g. `set WASI_SDK_PATH=c:\github\wasi-sdk`. | ||
- Note that WASI-SDK 22 only includes a copy of `pthread.h` for the `wasm32-wasi-threads` target, which we must copy to the include directory for the `wasm32-wasip2` target, e.g. `cp %WASI_SDK_PATH%\share\wasi-sysroot\include\wasm32-wasi-threads\pthread.h %WASI_SDK_PATH%\share\wasi-sysroot\include\wasm32-wasip2\`. This is a temporary workaround until https://github.com/WebAssembly/wasi-libc/issues/501 has been addressed and released. | ||
- Also, due to [this bug](https://github.com/bytecodealliance/wasm-component-ld/issues/22), we need to replace the `wasm-component-ld` that ships with WASI-SDK 22 with an updated version. If you have [cargo](https://rustup.rs/), you can run e.g. `cargo install [email protected] --root %WASI_SDK_PATH%`; otherwise, you can download it from [here](https://github.com/bytecodealliance/wasm-component-ld/releases/tag/v0.5.5), extract the binary, and copy it into `%WASI_SDK_PATH%\bin`. | ||
- Run `build clr.aot+libs -c [Debug|Release] -a wasm -os [browser|wasi]`. This will create the architecture-dependent libraries needed for linking and runtime execution, as well as the managed binaries to be used as input to ILC. | ||
|
||
For the compilers: | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
$RootPath = $Args[0] | ||
|
||
$NpmExePath = $Env:NPM_EXECUTABLE | ||
|
||
Set-Location -Path $RootPath | ||
|
||
& $NpmExePath install @bytecodealliance/jco | ||
& $NpmExePath install @bytecodealliance/preview2-shim | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
mkdir "%1" 2>nul | ||
cd /D "%1" | ||
|
||
echo Installing Wasmtime | ||
|
||
powershell -NoProfile -NoLogo -ExecutionPolicy ByPass -File "%~dp0install-wasmtime.ps1" | ||
if %errorlevel% NEQ 0 goto fail | ||
|
||
echo Setting WASMTIME_EXECUTABLE to %1\wasmtime\bin\wasmtime.exe | ||
echo ##vso[task.setvariable variable=WASMTIME_EXECUTABLE]%1\wasmtime\bin\wasmtime.exe | ||
|
||
exit /b 0 | ||
|
||
fail: | ||
echo "Failed to install wasmtime" | ||
exit /b 1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
Invoke-WebRequest -Uri https://github.com/bytecodealliance/wasmtime/releases/download/v21.0.1/wasmtime-v21.0.1-x86_64-windows.zip -OutFile wasmtime-v21.0.1-x86_64-windows.zip | ||
|
||
mkdir wasmtime\bin | ||
|
||
Expand-Archive -LiteralPath wasmtime-v21.0.1-x86_64-windows.zip -DestinationPath . | ||
del wasmtime-v21.0.1-x86_64-windows.zip | ||
move wasmtime-v21.0.1-x86_64-windows\wasmtime.exe wasmtime\bin\ | ||
Remove-Item -Recurse wasmtime-v21.0.1-x86_64-windows |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
#!/usr/bin/env bash | ||
|
||
exename=$(basename "$1" .dll) | ||
dirname=$(dirname "$1") | ||
|
||
node="node --stack_trace_limit=100" | ||
wasmtime="wasmtime run -S http" | ||
|
||
if [ -e "${dirname}/${exename}.js" ]; then | ||
WASM_HOST_EXECUTABLE=$node | ||
WASM_BINARY_TO_EXECUTE="${dirname}/${exename}.js" | ||
elif [ -e "${dirname}/main.js" ]; then | ||
WASM_HOST_EXECUTABLE=$node | ||
WASM_BINARY_TO_EXECUTE="${dirname}/main.js" | ||
elif [ -e "${dirname}/${exename}.mjs" ]; then | ||
WASM_HOST_EXECUTABLE=$node | ||
WASM_BINARY_TO_EXECUTE="${dirname}/${exename}.mjs" | ||
elif [ -e "${dirname}/main.mjs" ]; then | ||
WASM_HOST_EXECUTABLE=$node | ||
WASM_BINARY_TO_EXECUTE="${dirname}/main.mjs" | ||
elif [ -e "${dirname}/${exename}.wasm" ]; then | ||
WASM_HOST_EXECUTABLE=$wasmtime | ||
WASM_BINARY_TO_EXECUTE="${dirname}/${exename}.wasm" | ||
fi |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
#!/usr/bin/env bash | ||
|
||
SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd) | ||
|
||
source $SCRIPT_DIR/FindWasmHostExecutable.sh "$1" | ||
|
||
if [ -n "${WASM_HOST_EXECUTABLE}" ]; then | ||
echo $WASM_HOST_EXECUTABLE "$WASM_BINARY_TO_EXECUTE" "${@:2}" | ||
$WASM_HOST_EXECUTABLE "$WASM_BINARY_TO_EXECUTE" "${@:2}" | ||
else | ||
exit 1 | ||
fi |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.