src/runtime/time.go | 6 ++++++ diff --git a/src/runtime/time.go b/src/runtime/time.go index fdb5066b24f31718d7db566c4ac5821efbf911b6..ec3eae9ccad4010fcd79afc8e71b46825844ab3d 100644 --- a/src/runtime/time.go +++ b/src/runtime/time.go @@ -594,8 +594,14 @@ loop: for { switch s := atomic.Load(&t.status); s { case timerWaiting: + if !atomic.Cas(&t.status, s, timerMoving) { + continue + } t.pp = 0 doaddtimer(pp, t) + if !atomic.Cas(&t.status, timerMoving, timerWaiting) { + badTimer() + } break loop case timerModifiedEarlier, timerModifiedLater: if !atomic.Cas(&t.status, s, timerMoving) {