diff options
| author | cuiweixie <cuiweixie@gmail.com> | 2022-08-26 10:27:57 +0800 |
|---|---|---|
| committer | Michael Knyszek <mknyszek@google.com> | 2022-08-31 15:33:00 +0000 |
| commit | fa0e3bffb494fb9f97c241d6579daa443fbcbb06 (patch) | |
| tree | eeaf7bcb382ccb5a41bd749cabdf434339a96025 /src/runtime | |
| parent | 6e74c4116ae2825efab69cb8c60d078d76572a78 (diff) | |
| download | go-fa0e3bffb494fb9f97c241d6579daa443fbcbb06.tar.xz | |
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 <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>
Diffstat (limited to 'src/runtime')
| -rw-r--r-- | src/runtime/export_test.go | 2 | ||||
| -rw-r--r-- | src/runtime/sema.go | 14 |
2 files changed, 8 insertions, 8 deletions
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 |
