aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorcuiweixie <cuiweixie@gmail.com>2022-08-26 10:27:57 +0800
committerMichael Knyszek <mknyszek@google.com>2022-08-31 15:33:00 +0000
commitfa0e3bffb494fb9f97c241d6579daa443fbcbb06 (patch)
treeeeaf7bcb382ccb5a41bd749cabdf434339a96025 /src
parent6e74c4116ae2825efab69cb8c60d078d76572a78 (diff)
downloadgo-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')
-rw-r--r--src/runtime/export_test.go2
-rw-r--r--src/runtime/sema.go14
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