mirror of
https://github.com/golang/go
synced 2024-11-26 05:07:59 -07:00
runtime: move findrunnable timer delay computation closer to use
findrunnable has a couple places where delta is recomputed from a new pollUntil value. This proves to be a pain in refactoring, as it is easy to forget to do properly. Move computation of delta closer to its use, where it is more logical anyways. This CL should have no functional changes. For #43997. For #44313. Change-Id: I89980fd7f40f8a4c56c7540cae03ff99e12e1422 Reviewed-on: https://go-review.googlesource.com/c/go/+/307910 Trust: Michael Pratt <mpratt@google.com> Run-TryBot: Michael Pratt <mpratt@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Michael Knyszek <mknyszek@google.com>
This commit is contained in:
parent
9fbcba6664
commit
f6e7fe2711
@ -239,7 +239,7 @@ func notetsleepg(n *note, ns int64) bool {
|
||||
return ok
|
||||
}
|
||||
|
||||
func beforeIdle(int64) (*g, bool) {
|
||||
func beforeIdle(int64, int64) (*g, bool) {
|
||||
return nil, false
|
||||
}
|
||||
|
||||
|
@ -176,7 +176,12 @@ var idleID int32
|
||||
// If an event handler returned, we resume it and it will pause the execution.
|
||||
// beforeIdle either returns the specific goroutine to schedule next or
|
||||
// indicates with otherReady that some goroutine became ready.
|
||||
func beforeIdle(delay int64) (gp *g, otherReady bool) {
|
||||
func beforeIdle(now, pollUntil int64) (gp *g, otherReady bool) {
|
||||
delay := int64(-1)
|
||||
if pollUntil != 0 {
|
||||
delay = pollUntil - now
|
||||
}
|
||||
|
||||
if delay > 0 {
|
||||
clearIdleID()
|
||||
if delay < 1e6 {
|
||||
|
@ -298,7 +298,7 @@ func notetsleepg(n *note, ns int64) bool {
|
||||
return ok
|
||||
}
|
||||
|
||||
func beforeIdle(int64) (*g, bool) {
|
||||
func beforeIdle(int64, int64) (*g, bool) {
|
||||
return nil, false
|
||||
}
|
||||
|
||||
|
@ -2742,17 +2742,11 @@ stop:
|
||||
}
|
||||
}
|
||||
|
||||
delta := int64(-1)
|
||||
if pollUntil != 0 {
|
||||
// checkTimers ensures that polluntil > now.
|
||||
delta = pollUntil - now
|
||||
}
|
||||
|
||||
// wasm only:
|
||||
// If a callback returned and no other goroutine is awake,
|
||||
// then wake event handler goroutine which pauses execution
|
||||
// until a callback was triggered.
|
||||
gp, otherReady := beforeIdle(delta)
|
||||
gp, otherReady := beforeIdle(now, pollUntil)
|
||||
if gp != nil {
|
||||
casgstatus(gp, _Gwaiting, _Grunnable)
|
||||
if trace.enabled {
|
||||
@ -2842,15 +2836,6 @@ stop:
|
||||
}
|
||||
}
|
||||
}
|
||||
if pollUntil != 0 {
|
||||
if now == 0 {
|
||||
now = nanotime()
|
||||
}
|
||||
delta = pollUntil - now
|
||||
if delta < 0 {
|
||||
delta = 0
|
||||
}
|
||||
}
|
||||
|
||||
// Check for idle-priority GC work again.
|
||||
//
|
||||
@ -2909,11 +2894,21 @@ stop:
|
||||
if _g_.m.spinning {
|
||||
throw("findrunnable: netpoll with spinning")
|
||||
}
|
||||
delay := int64(-1)
|
||||
if pollUntil != 0 {
|
||||
if now == 0 {
|
||||
now = nanotime()
|
||||
}
|
||||
delay = pollUntil - now
|
||||
if delay < 0 {
|
||||
delay = 0
|
||||
}
|
||||
}
|
||||
if faketime != 0 {
|
||||
// When using fake time, just poll.
|
||||
delta = 0
|
||||
delay = 0
|
||||
}
|
||||
list := netpoll(delta) // block until new work is available
|
||||
list := netpoll(delay) // block until new work is available
|
||||
atomic.Store64(&sched.pollUntil, 0)
|
||||
atomic.Store64(&sched.lastpoll, uint64(nanotime()))
|
||||
if faketime != 0 && list.empty() {
|
||||
|
Loading…
Reference in New Issue
Block a user