]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: simplify nobarrierWakeTime
authorIan Lance Taylor <iant@golang.org>
Thu, 29 Oct 2020 23:23:27 +0000 (16:23 -0700)
committerIan Lance Taylor <iant@golang.org>
Fri, 30 Oct 2020 17:54:57 +0000 (17:54 +0000)
Also use the simplified nobarrierWakeTime in findrunnable, as it no
longer needs the current time.

Change-Id: I77b125d6a184dde0aeb517fc068164c274f0a046
Reviewed-on: https://go-review.googlesource.com/c/go/+/266304
Trust: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
src/runtime/proc.go
src/runtime/time.go

index c97f4820da37a1a612d7fa8a37b97481041f8cd9..939757f3a724920c357cade2a05a02be276add54 100644 (file)
@@ -2659,18 +2659,9 @@ stop:
        // checkTimers here because it calls adjusttimers which may need to allocate
        // memory, and that isn't allowed when we don't have an active P.
        for _, _p_ := range allpSnapshot {
-               // This is similar to nobarrierWakeTime, but minimizes calls to
-               // nanotime.
-               if atomic.Load(&_p_.adjustTimers) > 0 {
-                       if now == 0 {
-                               now = nanotime()
-                       }
-                       pollUntil = now
-               } else {
-                       w := int64(atomic.Load64(&_p_.timer0When))
-                       if w != 0 && (pollUntil == 0 || w < pollUntil) {
-                               pollUntil = w
-                       }
+               w := nobarrierWakeTime(_p_)
+               if w != 0 && (pollUntil == 0 || w < pollUntil) {
+                       pollUntil = w
                }
        }
        if pollUntil != 0 {
index 99290f66d0efb1c0c362f90892b7b6ec16ec6ccc..75b66f8492e57e2146f8f81cb81b4afd38ae6c38 100644 (file)
@@ -742,16 +742,15 @@ func addAdjustedTimers(pp *p, moved []*timer) {
 // nobarrierWakeTime looks at P's timers and returns the time when we
 // should wake up the netpoller. It returns 0 if there are no timers.
 // This function is invoked when dropping a P, and must run without
-// any write barriers. Therefore, if there are any timers that needs
-// to be moved earlier, it conservatively returns the current time.
-// The netpoller M will wake up and adjust timers before sleeping again.
+// any write barriers.
 //go:nowritebarrierrec
 func nobarrierWakeTime(pp *p) int64 {
-       if atomic.Load(&pp.adjustTimers) > 0 {
-               return nanotime()
-       } else {
-               return int64(atomic.Load64(&pp.timer0When))
+       next := int64(atomic.Load64(&pp.timer0When))
+       nextAdj := int64(atomic.Load64(&pp.timerModifiedEarliest))
+       if next == 0 || (nextAdj != 0 && nextAdj < next) {
+               next = nextAdj
        }
+       return next
 }
 
 // runtimer examines the first timer in timers. If it is ready based on now,