]> Cypherpunks.ru repositories - gostls13.git/commitdiff
[release-branch.go1.22] net: work around runtime scheduler starvation on js and wasip1
authorBryan C. Mills <bcmills@google.com>
Fri, 19 Jan 2024 21:51:24 +0000 (16:51 -0500)
committerCarlos Amedee <carlos@golang.org>
Wed, 28 Feb 2024 19:44:18 +0000 (19:44 +0000)
For #65883.
Updates #65177.
Updates #65178.
Updates #64321.

Change-Id: I698fd3b688c7dfbde692eb7c29cbdafc89e7ca32
Cq-Include-Trybots: luci.golang.try:go1.22-js-wasm,go1.22-wasip1-wasm_wasmtime,go1.22-wasip1-wasm_wazero
Reviewed-on: https://go-review.googlesource.com/c/go/+/557037
Auto-Submit: Bryan Mills <bcmills@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Damien Neil <dneil@google.com>
(cherry picked from commit f19f31f2e7c136a8dae03cbfe4f8ebbb8b54569b)
Reviewed-on: https://go-review.googlesource.com/c/go/+/566175
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
src/net/net_fake.go

index 6b6fdc728e974110e2aaf224bbad13dbe81ddbb2..525ff3229683342315cbdc66eb400f1c52e00785 100644 (file)
@@ -14,6 +14,7 @@ import (
        "errors"
        "io"
        "os"
+       "runtime"
        "sync"
        "sync/atomic"
        "syscall"
@@ -513,6 +514,15 @@ func (pq *packetQueue) send(dt *deadlineTimer, b []byte, from sockaddr, block bo
        if !block {
                full = pq.full
        }
+
+       // Before we check dt.expired, yield to other goroutines.
+       // This may help to prevent starvation of the goroutine that runs the
+       // deadlineTimer's time.After callback.
+       //
+       // TODO(#65178): Remove this when the runtime scheduler no longer starves
+       // runnable goroutines.
+       runtime.Gosched()
+
        select {
        case <-dt.expired:
                return 0, os.ErrDeadlineExceeded
@@ -563,6 +573,15 @@ func (pq *packetQueue) recvfrom(dt *deadlineTimer, b []byte, wholePacket bool, c
                // (Without this, TestZeroByteRead deadlocks.)
                empty = pq.empty
        }
+
+       // Before we check dt.expired, yield to other goroutines.
+       // This may help to prevent starvation of the goroutine that runs the
+       // deadlineTimer's time.After callback.
+       //
+       // TODO(#65178): Remove this when the runtime scheduler no longer starves
+       // runnable goroutines.
+       runtime.Gosched()
+
        select {
        case <-dt.expired:
                return 0, nil, os.ErrDeadlineExceeded