From 3ad5cd4741e438410d57f622e27b69e7e2809042 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Fri, 16 Feb 2024 18:42:08 -0500 Subject: [PATCH] runtime: update timers.len with Store instead of Add Writes to timers.len are protected by the timers.lock. There is no need to use an Add instead of a Store, and the code is clearer (and perhaps slightly faster) using the Store. Change-Id: Icc6caef1b7405adec55c9b55b999b71de7d97484 Reviewed-on: https://go-review.googlesource.com/c/go/+/564976 Auto-Submit: Russ Cox Reviewed-by: Austin Clements LUCI-TryBot-Result: Go LUCI --- src/runtime/time.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/runtime/time.go b/src/runtime/time.go index d86704a0682..1c276fce41d 100644 --- a/src/runtime/time.go +++ b/src/runtime/time.go @@ -288,7 +288,7 @@ func (ts *timers) add(t *timer) { if t == ts.heap[0] { ts.minWhen.Store(t.when) } - ts.len.Add(1) + ts.len.Store(uint32(len(ts.heap))) } // stop deletes the timer t. It may be on some other P, so we can't @@ -330,8 +330,8 @@ func (ts *timers) deleteMin() { ts.siftDown(0) } ts.updateMinWhen() - n := ts.len.Add(-1) - if n == 0 { + ts.len.Store(uint32(last)) + if last == 0 { // If there are no timers, then clearly none are modified. ts.minNextWhen.Store(0) } @@ -764,11 +764,11 @@ func updateTimerPMask(pp *p) { return } - // Looks like there are no timers, however another P may transiently - // decrement numTimers when handling a timerModified timer in - // checkTimers. We must take timersLock to serialize with these changes. + // Looks like there are no timers, however another P + // may be adding one at this very moment. + // Take the lock to synchronize. lock(&pp.timers.lock) - if pp.timers.len.Load() == 0 { + if len(pp.timers.heap) == 0 { timerpMask.clear(pp.id) } unlock(&pp.timers.lock)