diff options
author | Ian Lance Taylor <iant@golang.org> | 2020-03-23 11:38:49 -0700 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2020-03-24 19:39:44 +0000 |
commit | 355f53f0a0a5d79032068d4914d7aea3435084ec (patch) | |
tree | f831e9948b2d0b3a4b834b472ed179308d367b22 /src/runtime/time.go | |
parent | f95ff37cb06652b5b4dd244e72b939a36258c273 (diff) | |
download | go-355f53f0a0a5d79032068d4914d7aea3435084ec.tar.gz go-355f53f0a0a5d79032068d4914d7aea3435084ec.zip |
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 <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Diffstat (limited to 'src/runtime/time.go')
-rw-r--r-- | src/runtime/time.go | 12 |
1 files 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 |