runtime: don't call funcPC from a function
The escape analysis support is not yet good enough to avoid escaping the argument to funcPC. This causes unnecessary and often harmful memory allocation. E.g., (*cpuProfile).addExtra can be called from a signal handler, and it must not allocate memory. Move the calls to funcPC to use variables instead. This was done in the original migration to using funcPC, but was not done for newer code. In one case, in signal handling code, use getSigtramp. Reviewed-on: https://go-review.googlesource.com/92735 From-SVN: r257463
This commit is contained in:
parent
82e259b893
commit
f1a2d8b1b5
4 changed files with 9 additions and 7 deletions
|
@ -1,4 +1,4 @@
|
|||
5fe998e4a18cc1dbbd4869be5c8202bda55adb33
|
||||
cdc28627b7abfd73f5d552813db8eb4293b823b0
|
||||
|
||||
The first line of this file holds the git revision number of the last
|
||||
merge done from the gofrontend repository.
|
||||
|
|
|
@ -156,8 +156,8 @@ func (p *cpuProfile) addExtra() {
|
|||
if p.lostExtra > 0 {
|
||||
hdr := [1]uint64{p.lostExtra}
|
||||
lostStk := [2]uintptr{
|
||||
funcPC(_LostExternalCode) + sys.PCQuantum,
|
||||
funcPC(_ExternalCode) + sys.PCQuantum,
|
||||
_LostExternalCodePC + sys.PCQuantum,
|
||||
_ExternalCodePC + sys.PCQuantum,
|
||||
}
|
||||
cpuprof.log.write(nil, 0, hdr[:], lostStk[:])
|
||||
p.lostExtra = 0
|
||||
|
@ -167,8 +167,8 @@ func (p *cpuProfile) addExtra() {
|
|||
func (p *cpuProfile) addLostAtomic64(count uint64) {
|
||||
hdr := [1]uint64{count}
|
||||
lostStk := [2]uintptr{
|
||||
funcPC(_LostSIGPROFDuringAtomic64) + sys.PCQuantum,
|
||||
funcPC(_System) + sys.PCQuantum,
|
||||
_LostSIGPROFDuringAtomic64PC + sys.PCQuantum,
|
||||
_SystemPC + sys.PCQuantum,
|
||||
}
|
||||
cpuprof.log.write(nil, 0, hdr[:], lostStk[:])
|
||||
}
|
||||
|
|
|
@ -3369,7 +3369,9 @@ var lostAtomic64Count uint64
|
|||
|
||||
var _SystemPC = funcPC(_System)
|
||||
var _ExternalCodePC = funcPC(_ExternalCode)
|
||||
var _LostExternalCodePC = funcPC(_LostExternalCode)
|
||||
var _GCPC = funcPC(_GC)
|
||||
var _LostSIGPROFDuringAtomic64PC = funcPC(_LostSIGPROFDuringAtomic64)
|
||||
|
||||
// Called if we receive a SIGPROF signal.
|
||||
// Called by the signal handler, may run during STW.
|
||||
|
@ -3469,7 +3471,7 @@ func sigprofNonGoPC(pc uintptr) {
|
|||
if prof.hz != 0 {
|
||||
stk := []uintptr{
|
||||
pc,
|
||||
funcPC(_ExternalCode) + sys.PCQuantum,
|
||||
_ExternalCodePC + sys.PCQuantum,
|
||||
}
|
||||
cpuprof.addNonGo(stk)
|
||||
}
|
||||
|
|
|
@ -245,7 +245,7 @@ func setProcessCPUProfiler(hz int32) {
|
|||
// Enable the Go signal handler if not enabled.
|
||||
if atomic.Cas(&handlingSig[_SIGPROF], 0, 1) {
|
||||
atomic.Storeuintptr(&fwdSig[_SIGPROF], getsig(_SIGPROF))
|
||||
setsig(_SIGPROF, funcPC(sighandler))
|
||||
setsig(_SIGPROF, getSigtramp())
|
||||
}
|
||||
} else {
|
||||
// If the Go signal handler should be disabled by default,
|
||||
|
|
Loading…
Add table
Reference in a new issue