]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: use correct state machine in addAdjustedTimers
authorIan Lance Taylor <iant@golang.org>
Wed, 30 Oct 2019 22:12:52 +0000 (15:12 -0700)
committerIan Lance Taylor <iant@golang.org>
Fri, 1 Nov 2019 05:38:51 +0000 (05:38 +0000)
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>
src/runtime/time.go

index db48a932d40656753ea6ee12b52dacbeb9967dde..6c1170bbc00512edcbac6d193a094f6842d09e5d 100644 (file)
@@ -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: