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-25 20:24:45 +0000 |
commit | ca153f4db7e40f151dbd02081c0814194342428a (patch) | |
tree | 27cc3800e8a8d7350b93f631ca00600d89509719 | |
parent | f75a45c4d77ccd198773222c5adce3a23e8c024e (diff) | |
download | go-ca153f4db7e40f151dbd02081c0814194342428a.tar.gz go-ca153f4db7e40f151dbd02081c0814194342428a.zip |
[release-branch.go1.14] runtime: don't call wakeNetPoller during timerModifying
Reduce the length of time that other timer functions can see timerModifying.
In particular avoid system calls.
For #38023
Fixes #38051
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>
(cherry picked from commit 355f53f0a0a5d79032068d4914d7aea3435084ec)
Reviewed-on: https://go-review.googlesource.com/c/go/+/225277
-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 93565cf369..ed73bf7374 100644 --- a/src/runtime/time.go +++ b/src/runtime/time.go @@ -245,11 +245,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() @@ -262,7 +257,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 @@ -437,10 +431,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 |