aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris O'Hara <cohara87@gmail.com>2023-05-25 12:07:48 +1000
committerGopher Robot <gobot@golang.org>2023-06-27 01:09:18 +0000
commit13529cc5f443ef4e242da3716daa0032aa8d34f2 (patch)
treebef4196444db39ab7002f093611f48bbd866c69b
parent1dbbafc70fd3e2c284469ab3e0936c1bb56129f6 (diff)
downloadgo-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.go14
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