aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/time.go
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2019-10-30 15:12:52 -0700
committerIan Lance Taylor <iant@golang.org>2019-11-01 05:38:51 +0000
commite96fd132644953e762314c87922e217284499ca6 (patch)
treeac24acd161e6f266ec9000b251ee167e53819e80 /src/runtime/time.go
parentefd395f9fb429ea3e677d9e378b858cd083eec11 (diff)
downloadgo-e96fd132644953e762314c87922e217284499ca6.tar.gz
go-e96fd132644953e762314c87922e217284499ca6.zip
runtime: use correct state machine in addAdjustedTimers
The addAdjustedTimers function was a late addition, and it got some of the state machine wrong, leading to failures like https://storage.googleapis.com/go-build-log/930576b6/windows-amd64-2016_53d0319e.log Updates #6239 Updates #27707 Change-Id: I9e94e563b4698ff3035ce609055ca292b9cab3df Reviewed-on: https://go-review.googlesource.com/c/go/+/204280 Run-TryBot: Ian Lance Taylor <iant@golang.org> Reviewed-by: Michael Knyszek <mknyszek@google.com>
Diffstat (limited to 'src/runtime/time.go')
-rw-r--r--src/runtime/time.go10
1 files changed, 6 insertions, 4 deletions
diff --git a/src/runtime/time.go b/src/runtime/time.go
index db48a932d4..6c1170bbc0 100644
--- a/src/runtime/time.go
+++ b/src/runtime/time.go
@@ -989,10 +989,12 @@ func addAdjustedTimers(pp *p, moved []*timer) {
case timerDeleted:
// Timer has been deleted since we adjusted it.
// This timer is already out of the heap.
- if !atomic.Cas(&t.status, s, timerRemoved) {
- badTimer()
+ if atomic.Cas(&t.status, s, timerRemoving) {
+ if !atomic.Cas(&t.status, timerRemoving, timerRemoved) {
+ badTimer()
+ }
+ break loop
}
- break loop
case timerModifiedEarlier, timerModifiedLater:
// Timer has been modified again since
// we adjusted it.
@@ -1007,8 +1009,8 @@ func addAdjustedTimers(pp *p, moved []*timer) {
if s == timerModifiedEarlier {
atomic.Xadd(&pp.adjustTimers, -1)
}
+ break loop
}
- break loop
case timerNoStatus, timerRunning, timerRemoving, timerRemoved, timerMoving:
badTimer()
case timerModifying: