aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2020-03-23 11:38:49 -0700
committerIan Lance Taylor <iant@golang.org>2020-03-25 20:24:45 +0000
commitca153f4db7e40f151dbd02081c0814194342428a (patch)
tree27cc3800e8a8d7350b93f631ca00600d89509719
parentf75a45c4d77ccd198773222c5adce3a23e8c024e (diff)
downloadgo-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.go12
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