mirror of https://github.com/golang/go.git
runtime: convert prof.hz to atomic type
This converts several unsynchronized reads (reads without holding prof.signalLock) into atomic reads. For #53821. For #52912. Change-Id: I421b96a22fbe26d699bcc21010c8a9e0f4efc276 Reviewed-on: https://go-review.googlesource.com/c/go/+/420196 Reviewed-by: Austin Clements <austin@google.com> Run-TryBot: Michael Pratt <mpratt@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
parent
3121c2bf64
commit
54cf1b107d
|
|
@ -110,7 +110,7 @@ func (p *cpuProfile) add(tagPtr *unsafe.Pointer, stk []uintptr) {
|
||||||
osyield()
|
osyield()
|
||||||
}
|
}
|
||||||
|
|
||||||
if prof.hz != 0 { // implies cpuprof.log != nil
|
if prof.hz.Load() != 0 { // implies cpuprof.log != nil
|
||||||
if p.numExtra > 0 || p.lostExtra > 0 || p.lostAtomic > 0 {
|
if p.numExtra > 0 || p.lostExtra > 0 || p.lostAtomic > 0 {
|
||||||
p.addExtra()
|
p.addExtra()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4475,7 +4475,10 @@ func mcount() int32 {
|
||||||
|
|
||||||
var prof struct {
|
var prof struct {
|
||||||
signalLock atomic.Uint32
|
signalLock atomic.Uint32
|
||||||
hz int32
|
|
||||||
|
// Must hold signalLock to write. Reads may be lock-free, but
|
||||||
|
// signalLock should be taken to synchronize with changes.
|
||||||
|
hz atomic.Int32
|
||||||
}
|
}
|
||||||
|
|
||||||
func _System() { _System() }
|
func _System() { _System() }
|
||||||
|
|
@ -4490,7 +4493,7 @@ func _VDSO() { _VDSO() }
|
||||||
//
|
//
|
||||||
//go:nowritebarrierrec
|
//go:nowritebarrierrec
|
||||||
func sigprof(pc, sp, lr uintptr, gp *g, mp *m) {
|
func sigprof(pc, sp, lr uintptr, gp *g, mp *m) {
|
||||||
if prof.hz == 0 {
|
if prof.hz.Load() == 0 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4587,7 +4590,7 @@ func sigprof(pc, sp, lr uintptr, gp *g, mp *m) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if prof.hz != 0 {
|
if prof.hz.Load() != 0 {
|
||||||
// Note: it can happen on Windows that we interrupted a system thread
|
// Note: it can happen on Windows that we interrupted a system thread
|
||||||
// with no g, so gp could nil. The other nil checks are done out of
|
// with no g, so gp could nil. The other nil checks are done out of
|
||||||
// caution, but not expected to be nil in practice.
|
// caution, but not expected to be nil in practice.
|
||||||
|
|
@ -4631,9 +4634,9 @@ func setcpuprofilerate(hz int32) {
|
||||||
for !prof.signalLock.CompareAndSwap(0, 1) {
|
for !prof.signalLock.CompareAndSwap(0, 1) {
|
||||||
osyield()
|
osyield()
|
||||||
}
|
}
|
||||||
if prof.hz != hz {
|
if prof.hz.Load() != hz {
|
||||||
setProcessCPUProfiler(hz)
|
setProcessCPUProfiler(hz)
|
||||||
prof.hz = hz
|
prof.hz.Store(hz)
|
||||||
}
|
}
|
||||||
prof.signalLock.Store(0)
|
prof.signalLock.Store(0)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -502,7 +502,7 @@ var sigprofCallersUse uint32
|
||||||
//go:nosplit
|
//go:nosplit
|
||||||
//go:nowritebarrierrec
|
//go:nowritebarrierrec
|
||||||
func sigprofNonGo(sig uint32, info *siginfo, ctx unsafe.Pointer) {
|
func sigprofNonGo(sig uint32, info *siginfo, ctx unsafe.Pointer) {
|
||||||
if prof.hz != 0 {
|
if prof.hz.Load() != 0 {
|
||||||
c := &sigctxt{info, ctx}
|
c := &sigctxt{info, ctx}
|
||||||
// Some platforms (Linux) have per-thread timers, which we use in
|
// Some platforms (Linux) have per-thread timers, which we use in
|
||||||
// combination with the process-wide timer. Avoid double-counting.
|
// combination with the process-wide timer. Avoid double-counting.
|
||||||
|
|
@ -525,7 +525,7 @@ func sigprofNonGo(sig uint32, info *siginfo, ctx unsafe.Pointer) {
|
||||||
//go:nosplit
|
//go:nosplit
|
||||||
//go:nowritebarrierrec
|
//go:nowritebarrierrec
|
||||||
func sigprofNonGoPC(pc uintptr) {
|
func sigprofNonGoPC(pc uintptr) {
|
||||||
if prof.hz != 0 {
|
if prof.hz.Load() != 0 {
|
||||||
stk := []uintptr{
|
stk := []uintptr{
|
||||||
pc,
|
pc,
|
||||||
abi.FuncPCABIInternal(_ExternalCode) + sys.PCQuantum,
|
abi.FuncPCABIInternal(_ExternalCode) + sys.PCQuantum,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue