From: Russ Cox Date: Fri, 16 Feb 2024 23:42:08 +0000 (-0500) Subject: runtime: update timers.len with Store instead of Add X-Git-Tag: go1.23rc1~950 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=3ad5cd4741e438410d57f622e27b69e7e2809042;p=gostls13.git 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 --- diff --git a/src/runtime/time.go b/src/runtime/time.go index d86704a068..1c276fce41 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)