From: Ian Lance Taylor Date: Wed, 30 Oct 2019 22:12:52 +0000 (-0700) Subject: runtime: use correct state machine in addAdjustedTimers X-Git-Tag: go1.14beta1~477 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=e96fd132644953e762314c87922e217284499ca6;p=gostls13.git 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 Reviewed-by: Michael Knyszek --- 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: