From: cuiweixie Date: Fri, 26 Aug 2022 02:27:57 +0000 (+0800) Subject: runtime: convert semaRoot.nwait to atomic type X-Git-Tag: go1.20rc1~1326 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=fa0e3bffb494fb9f97c241d6579daa443fbcbb06;p=gostls13.git runtime: convert semaRoot.nwait to atomic type 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 Reviewed-by: Michael Pratt Reviewed-by: Michael Knyszek Auto-Submit: Michael Knyszek Run-TryBot: Michael Pratt --- diff --git a/src/runtime/export_test.go b/src/runtime/export_test.go index 32d33adc79..77e4279b9d 100644 --- a/src/runtime/export_test.go +++ b/src/runtime/export_test.go @@ -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 diff --git a/src/runtime/sema.go b/src/runtime/sema.go index 4b965ea80a..c654889cac 100644 --- a/src/runtime/sema.go +++ b/src/runtime/sema.go @@ -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