]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: update timers.len with Store instead of Add
authorRuss Cox <rsc@golang.org>
Fri, 16 Feb 2024 23:42:08 +0000 (18:42 -0500)
committerGopher Robot <gobot@golang.org>
Fri, 8 Mar 2024 21:09:39 +0000 (21:09 +0000)
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 <rsc@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>

src/runtime/time.go

index d86704a0682fc19308e9d1550f72153823bb89db..1c276fce41d166a240e605ac5dbd84a9478ded4e 100644 (file)
@@ -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)