mirror of https://github.com/golang/go.git
[release-branch.go1.22] net: work around runtime scheduler starvation on js and wasip1
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 f19f31f2e7)
Reviewed-on: https://go-review.googlesource.com/c/go/+/566175
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
This commit is contained in:
parent
5330cd225b
commit
f73eba76a0
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue