]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: convert semaRoot.nwait to atomic type
authorcuiweixie <cuiweixie@gmail.com>
Fri, 26 Aug 2022 02:27:57 +0000 (10:27 +0800)
committerMichael Knyszek <mknyszek@google.com>
Wed, 31 Aug 2022 15:33:00 +0000 (15:33 +0000)
For #53821

Change-Id: I686fe81268f70acc6a4c3e6b1d3ed0e07bb0d61c
Reviewed-on: https://go-review.googlesource.com/c/go/+/425775
Run-TryBot: xie cui <523516579@qq.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Michael Pratt <mpratt@google.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Auto-Submit: Michael Knyszek <mknyszek@google.com>
Run-TryBot: Michael Pratt <mpratt@google.com>

src/runtime/export_test.go
src/runtime/sema.go

index 32d33adc79f76164bb6dd6e181fa606a91b8aeb6..77e4279b9d1e528ff7d113e8993eb2981b0aa462 100644 (file)
@@ -1164,7 +1164,7 @@ var Semrelease1 = semrelease1
 
 func SemNwait(addr *uint32) uint32 {
        root := semtable.rootFor(addr)
-       return atomic.Load(&root.nwait)
+       return root.nwait.Load()
 }
 
 const SemTableSize = semTabSize
index 4b965ea80a8854834baac8ac6ed8dae3cb601d9a..c654889caca9d0ac2f4257b13a677acef630c4c4 100644 (file)
@@ -39,8 +39,8 @@ import (
 // BenchmarkSemTable/OneAddrCollision/* for a benchmark that exercises this.
 type semaRoot struct {
        lock  mutex
-       treap *sudog // root of balanced tree of unique waiters.
-       nwait uint32 // Number of waiters. Read w/o the lock.
+       treap *sudog        // root of balanced tree of unique waiters.
+       nwait atomic.Uint32 // Number of waiters. Read w/o the lock.
 }
 
 var semtable semTable
@@ -137,10 +137,10 @@ func semacquire1(addr *uint32, lifo bool, profile semaProfileFlags, skipframes i
        for {
                lockWithRank(&root.lock, lockRankRoot)
                // Add ourselves to nwait to disable "easy case" in semrelease.
-               atomic.Xadd(&root.nwait, 1)
+               root.nwait.Add(1)
                // Check cansemacquire to avoid missed wakeup.
                if cansemacquire(addr) {
-                       atomic.Xadd(&root.nwait, -1)
+                       root.nwait.Add(-1)
                        unlock(&root.lock)
                        break
                }
@@ -169,13 +169,13 @@ func semrelease1(addr *uint32, handoff bool, skipframes int) {
        // Easy case: no waiters?
        // This check must happen after the xadd, to avoid a missed wakeup
        // (see loop in semacquire).
-       if atomic.Load(&root.nwait) == 0 {
+       if root.nwait.Load() == 0 {
                return
        }
 
        // Harder case: search for a waiter and wake it.
        lockWithRank(&root.lock, lockRankRoot)
-       if atomic.Load(&root.nwait) == 0 {
+       if root.nwait.Load() == 0 {
                // The count is already consumed by another goroutine,
                // so no need to wake up another goroutine.
                unlock(&root.lock)
@@ -183,7 +183,7 @@ func semrelease1(addr *uint32, handoff bool, skipframes int) {
        }
        s, t0 := root.dequeue(addr)
        if s != nil {
-               atomic.Xadd(&root.nwait, -1)
+               root.nwait.Add(-1)
        }
        unlock(&root.lock)
        if s != nil { // May be slow or even yield, so unlock first