From: Ian Lance Taylor Date: Mon, 23 Mar 2020 18:38:49 +0000 (-0700) Subject: runtime: don't call wakeNetPoller during timerModifying X-Git-Tag: go1.15beta1~770 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=355f53f0a0a5d79032068d4914d7aea3435084ec;p=gostls13.git runtime: don't call wakeNetPoller during timerModifying Reduce the length of time that other timer functions can see timerModifying. In particular avoid system calls. Fixes #38023 Change-Id: I1b61229c668e6085d9ee6dca9488a90055386c36 Reviewed-on: https://go-review.googlesource.com/c/go/+/224902 Run-TryBot: Ian Lance Taylor TryBot-Result: Gobot Gobot Reviewed-by: Michael Knyszek --- diff --git a/src/runtime/time.go b/src/runtime/time.go index c62207d7f7..50e3d4b60b 100644 --- a/src/runtime/time.go +++ b/src/runtime/time.go @@ -251,11 +251,6 @@ func addtimer(t *timer) { } t.status = timerWaiting - addInitializedTimer(t) -} - -// addInitializedTimer adds an initialized timer to the current P. -func addInitializedTimer(t *timer) { when := t.when pp := getg().m.p.ptr() @@ -268,7 +263,6 @@ func addInitializedTimer(t *timer) { } // doaddtimer adds t to the current P's heap. -// It reports whether it saw no problems due to races. // The caller must have locked the timers for pp. func doaddtimer(pp *p, t *timer) { // Timers rely on the network poller, so make sure the poller @@ -443,10 +437,14 @@ loop: if wasRemoved { t.when = when - addInitializedTimer(t) + pp := getg().m.p.ptr() + lock(&pp.timersLock) + doaddtimer(pp, t) + unlock(&pp.timersLock) if !atomic.Cas(&t.status, timerModifying, timerWaiting) { badTimer() } + wakeNetPoller(when) } else { // The timer is in some other P's heap, so we can't change // the when field. If we did, the other P's heap would