aboutsummaryrefslogtreecommitdiff
path: root/src/runtime
diff options
context:
space:
mode:
authorMichael Pratt <mpratt@google.com>2022-07-25 15:39:07 -0400
committerMichael Pratt <mpratt@google.com>2022-08-12 01:52:46 +0000
commit09cc9bac724896cac02b0da8b259febddde52759 (patch)
treee5a9ed99facd1912c0859d2c9122c035fbc47c10 /src/runtime
parent88ef50e6623e55875d783e5715be1dc0683717e0 (diff)
downloadgo-09cc9bac724896cac02b0da8b259febddde52759.tar.xz
runtime: convert schedt.sysmonwait to atomic type
This converts a few unsynchronized accesses. For #53821. Change-Id: Ie2728779111e3e042696f15648981c5d5a86ca6d Reviewed-on: https://go-review.googlesource.com/c/go/+/419448 Run-TryBot: Michael Pratt <mpratt@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Austin Clements <austin@google.com>
Diffstat (limited to 'src/runtime')
-rw-r--r--src/runtime/proc.go24
-rw-r--r--src/runtime/runtime2.go2
2 files changed, 13 insertions, 13 deletions
diff --git a/src/runtime/proc.go b/src/runtime/proc.go
index 8c1865351a..a2a02ebf9a 100644
--- a/src/runtime/proc.go
+++ b/src/runtime/proc.go
@@ -1271,8 +1271,8 @@ func startTheWorldWithSema(emitTraceEvent bool) int64 {
}
p1 := procresize(procs)
sched.gcwaiting.Store(false)
- if sched.sysmonwait != 0 {
- sched.sysmonwait = 0
+ if sched.sysmonwait.Load() {
+ sched.sysmonwait.Store(false)
notewakeup(&sched.sysmonnote)
}
unlock(&sched.lock)
@@ -3632,7 +3632,7 @@ func reentersyscall(pc, sp uintptr) {
save(pc, sp)
}
- if atomic.Load(&sched.sysmonwait) != 0 {
+ if sched.sysmonwait.Load() {
systemstack(entersyscall_sysmon)
save(pc, sp)
}
@@ -3670,8 +3670,8 @@ func entersyscall() {
func entersyscall_sysmon() {
lock(&sched.lock)
- if atomic.Load(&sched.sysmonwait) != 0 {
- atomic.Store(&sched.sysmonwait, 0)
+ if sched.sysmonwait.Load() {
+ sched.sysmonwait.Store(false)
notewakeup(&sched.sysmonnote)
}
unlock(&sched.lock)
@@ -3908,8 +3908,8 @@ func exitsyscallfast_reacquired() {
func exitsyscallfast_pidle() bool {
lock(&sched.lock)
pp, _ := pidleget(0)
- if pp != nil && atomic.Load(&sched.sysmonwait) != 0 {
- atomic.Store(&sched.sysmonwait, 0)
+ if pp != nil && sched.sysmonwait.Load() {
+ sched.sysmonwait.Store(false)
notewakeup(&sched.sysmonnote)
}
unlock(&sched.lock)
@@ -3944,8 +3944,8 @@ func exitsyscall0(gp *g) {
// could race with another M transitioning gp from unlocked to
// locked.
locked = gp.lockedm != 0
- } else if atomic.Load(&sched.sysmonwait) != 0 {
- atomic.Store(&sched.sysmonwait, 0)
+ } else if sched.sysmonwait.Load() {
+ sched.sysmonwait.Store(false)
notewakeup(&sched.sysmonnote)
}
unlock(&sched.lock)
@@ -5161,7 +5161,7 @@ func sysmon() {
syscallWake := false
next := timeSleepUntil()
if next > now {
- atomic.Store(&sched.sysmonwait, 1)
+ sched.sysmonwait.Store(true)
unlock(&sched.lock)
// Make wake-up period small enough
// for the sampling to be correct.
@@ -5178,7 +5178,7 @@ func sysmon() {
osRelax(false)
}
lock(&sched.lock)
- atomic.Store(&sched.sysmonwait, 0)
+ sched.sysmonwait.Store(false)
noteclear(&sched.sysmonnote)
}
if syscallWake {
@@ -5410,7 +5410,7 @@ func schedtrace(detailed bool) {
lock(&sched.lock)
print("SCHED ", (now-starttime)/1e6, "ms: gomaxprocs=", gomaxprocs, " idleprocs=", sched.npidle.Load(), " threads=", mcount(), " spinningthreads=", sched.nmspinning.Load(), " idlethreads=", sched.nmidle, " runqueue=", sched.runqsize)
if detailed {
- print(" gcwaiting=", sched.gcwaiting.Load(), " nmidlelocked=", sched.nmidlelocked, " stopwait=", sched.stopwait, " sysmonwait=", sched.sysmonwait, "\n")
+ print(" gcwaiting=", sched.gcwaiting.Load(), " nmidlelocked=", sched.nmidlelocked, " stopwait=", sched.stopwait, " sysmonwait=", sched.sysmonwait.Load(), "\n")
}
// We must be careful while reading data from P's, M's and G's.
// Even if we hold schedlock, most data can be changed concurrently.
diff --git a/src/runtime/runtime2.go b/src/runtime/runtime2.go
index ed618dff05..9216765fc6 100644
--- a/src/runtime/runtime2.go
+++ b/src/runtime/runtime2.go
@@ -820,7 +820,7 @@ type schedt struct {
gcwaiting atomic.Bool // gc is waiting to run
stopwait int32
stopnote note
- sysmonwait uint32
+ sysmonwait atomic.Bool
sysmonnote note
// safepointFn should be called on each P at the next GC