]> Cypherpunks.ru repositories - gostls13.git/commitdiff
runtime: convert schedt.sysmonwait to atomic type
authorMichael Pratt <mpratt@google.com>
Mon, 25 Jul 2022 19:39:07 +0000 (15:39 -0400)
committerMichael Pratt <mpratt@google.com>
Fri, 12 Aug 2022 01:52:46 +0000 (01:52 +0000)
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>
src/runtime/proc.go
src/runtime/runtime2.go

index 8c1865351a0bc230a9ef3ac160b3f1c2ad43c637..a2a02ebf9abc6b4d86febcac2cbdfb5b0ea47a39 100644 (file)
@@ -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.
index ed618dff05ddfdebabd69eddfbfa22943fb8b6d0..9216765fc62b8879087cedd2109539b9991fa5f1 100644 (file)
@@ -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