From 355f53f0a0a5d79032068d4914d7aea3435084ec Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Mon, 23 Mar 2020 11:38:49 -0700 Subject: [PATCH] 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 --- src/runtime/time.go | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) 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 -- 2.50.0