diff options
author | Chris O'Hara <cohara87@gmail.com> | 2023-05-25 12:07:48 +1000 |
---|---|---|
committer | Gopher Robot <gobot@golang.org> | 2023-06-27 01:09:18 +0000 |
commit | 13529cc5f443ef4e242da3716daa0032aa8d34f2 (patch) | |
tree | bef4196444db39ab7002f093611f48bbd866c69b | |
parent | 1dbbafc70fd3e2c284469ab3e0936c1bb56129f6 (diff) | |
download | go-13529cc5f443ef4e242da3716daa0032aa8d34f2.tar.gz go-13529cc5f443ef4e242da3716daa0032aa8d34f2.zip |
syscall: try non-blocking stdio on wasip1
Try to set stdio to non-blocking mode before the os package
calls NewFile for each fd. NewFile queries the non-blocking flag
but doesn't change it, even if the runtime supports non-blocking
stdio. Since WebAssembly modules are single-threaded, blocking
system calls temporarily halt execution of the module. If the
runtime supports non-blocking stdio, the Go runtime is able to
use the WASI net poller to poll for read/write readiness and is
able to schedule goroutines while waiting.
Change-Id: I1e3ce68a414e3c5960ce6a27fbfd38556e59c3dc
Reviewed-on: https://go-review.googlesource.com/c/go/+/498196
Reviewed-by: Johan Brandhorst-Satzkorn <johan.brandhorst@gmail.com>
Auto-Submit: Johan Brandhorst-Satzkorn <johan.brandhorst@gmail.com>
Reviewed-by: Achille Roussel <achille.roussel@gmail.com>
Reviewed-by: Heschi Kreinick <heschi@google.com>
Run-TryBot: Johan Brandhorst-Satzkorn <johan.brandhorst@gmail.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
-rw-r--r-- | src/syscall/fs_wasip1.go | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/syscall/fs_wasip1.go b/src/syscall/fs_wasip1.go index d60ab0b53e..4ad3f9610b 100644 --- a/src/syscall/fs_wasip1.go +++ b/src/syscall/fs_wasip1.go @@ -11,6 +11,20 @@ import ( "unsafe" ) +func init() { + // Try to set stdio to non-blocking mode before the os package + // calls NewFile for each fd. NewFile queries the non-blocking flag + // but doesn't change it, even if the runtime supports non-blocking + // stdio. Since WebAssembly modules are single-threaded, blocking + // system calls temporarily halt execution of the module. If the + // runtime supports non-blocking stdio, the Go runtime is able to + // use the WASI net poller to poll for read/write readiness and is + // able to schedule goroutines while waiting. + SetNonblock(0, true) + SetNonblock(1, true) + SetNonblock(2, true) +} + type uintptr32 = uint32 type size = uint32 type fdflags = uint32 |