1
0
mirror of https://github.com/golang/go synced 2024-11-18 06:14:46 -07:00

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>
This commit is contained in:
Ian Lance Taylor 2019-10-30 15:12:52 -07:00
parent efd395f9fb
commit e96fd13264

View File

@ -989,10 +989,12 @@ func addAdjustedTimers(pp *p, moved []*timer) {
case timerDeleted: case timerDeleted:
// Timer has been deleted since we adjusted it. // Timer has been deleted since we adjusted it.
// This timer is already out of the heap. // This timer is already out of the heap.
if !atomic.Cas(&t.status, s, timerRemoved) { if atomic.Cas(&t.status, s, timerRemoving) {
if !atomic.Cas(&t.status, timerRemoving, timerRemoved) {
badTimer() badTimer()
} }
break loop break loop
}
case timerModifiedEarlier, timerModifiedLater: case timerModifiedEarlier, timerModifiedLater:
// Timer has been modified again since // Timer has been modified again since
// we adjusted it. // we adjusted it.
@ -1007,8 +1009,8 @@ func addAdjustedTimers(pp *p, moved []*timer) {
if s == timerModifiedEarlier { if s == timerModifiedEarlier {
atomic.Xadd(&pp.adjustTimers, -1) atomic.Xadd(&pp.adjustTimers, -1)
} }
}
break loop break loop
}
case timerNoStatus, timerRunning, timerRemoving, timerRemoved, timerMoving: case timerNoStatus, timerRunning, timerRemoving, timerRemoved, timerMoving:
badTimer() badTimer()
case timerModifying: case timerModifying: