]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: move findrunnable timer delay computation closer to use
authorMichael Pratt <mpratt@google.com>
Wed, 7 Apr 2021 14:15:33 +0000 (10:15 -0400)
committerMichael Pratt <mpratt@google.com>
Fri, 16 Apr 2021 21:03:44 +0000 (21:03 +0000)
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>
src/runtime/lock_futex.go
src/runtime/lock_js.go
src/runtime/lock_sema.go
src/runtime/proc.go

index 017b481c642a3024654812d9b73422ff6c5c1522..e4c8d01941d196d46ad670d66396ab8ee85f05fe 100644 (file)
@@ -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
 }
 
index 04e7e85c126ff3a39a27df3cc46930acf19c26f7..0ca3512baf3c8313542cfe214057ef11772e917c 100644 (file)
@@ -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 {
index 3c0a7ca67ed7525edfafc254ac30f90c6bb835fe..7a6af28b561399aa45913e034db07202033ce1da 100644 (file)
@@ -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
 }
 
index 6c1c5dd91758cf7f810b0d9935368453827dd0a7..3ee5805aefc40c791a72c3256b165292405c485b 100644 (file)
@@ -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() {