1
0
mirror of https://github.com/golang/go synced 2024-11-26 09:28:07 -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:
Michael Pratt 2021-04-07 10:15:33 -04:00
parent 9fbcba6664
commit f6e7fe2711
4 changed files with 21 additions and 21 deletions

View File

@ -239,7 +239,7 @@ func notetsleepg(n *note, ns int64) bool {
return ok return ok
} }
func beforeIdle(int64) (*g, bool) { func beforeIdle(int64, int64) (*g, bool) {
return nil, false return nil, false
} }

View File

@ -176,7 +176,12 @@ var idleID int32
// If an event handler returned, we resume it and it will pause the execution. // If an event handler returned, we resume it and it will pause the execution.
// beforeIdle either returns the specific goroutine to schedule next or // beforeIdle either returns the specific goroutine to schedule next or
// indicates with otherReady that some goroutine became ready. // 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 { if delay > 0 {
clearIdleID() clearIdleID()
if delay < 1e6 { if delay < 1e6 {

View File

@ -298,7 +298,7 @@ func notetsleepg(n *note, ns int64) bool {
return ok return ok
} }
func beforeIdle(int64) (*g, bool) { func beforeIdle(int64, int64) (*g, bool) {
return nil, false return nil, false
} }

View File

@ -2742,17 +2742,11 @@ stop:
} }
} }
delta := int64(-1)
if pollUntil != 0 {
// checkTimers ensures that polluntil > now.
delta = pollUntil - now
}
// wasm only: // wasm only:
// If a callback returned and no other goroutine is awake, // If a callback returned and no other goroutine is awake,
// then wake event handler goroutine which pauses execution // then wake event handler goroutine which pauses execution
// until a callback was triggered. // until a callback was triggered.
gp, otherReady := beforeIdle(delta) gp, otherReady := beforeIdle(now, pollUntil)
if gp != nil { if gp != nil {
casgstatus(gp, _Gwaiting, _Grunnable) casgstatus(gp, _Gwaiting, _Grunnable)
if trace.enabled { 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. // Check for idle-priority GC work again.
// //
@ -2909,11 +2894,21 @@ stop:
if _g_.m.spinning { if _g_.m.spinning {
throw("findrunnable: netpoll with 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 { if faketime != 0 {
// When using fake time, just poll. // 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.pollUntil, 0)
atomic.Store64(&sched.lastpoll, uint64(nanotime())) atomic.Store64(&sched.lastpoll, uint64(nanotime()))
if faketime != 0 && list.empty() { if faketime != 0 && list.empty() {