aboutsummaryrefslogtreecommitdiff
path: root/src/cmd
diff options
context:
space:
mode:
authorAustin Clements <austin@google.com>2017-12-01 16:13:08 -0500
committerAustin Clements <austin@google.com>2018-05-07 21:38:40 +0000
commit44286b17c5ca6673648ba57b4a9d49ab8dffedf6 (patch)
tree19e9be51dced2da66cd7b6fb8cdd67aed045a39d /src/cmd
parenta8a050819bd4693ea7c6fdc1744038f172c2a439 (diff)
downloadgo-44286b17c5ca6673648ba57b4a9d49ab8dffedf6.tar.xz
runtime: replace system goroutine whitelist with symbol test
Currently isSystemGoroutine has a hard-coded list of known entry points into system goroutines. This list is annoying to maintain. For example, it's missing the ensureSigM goroutine. Replace it with a check that simply looks for any goroutine with runtime function as its entry point, with a few exceptions. This also matches the definition recently added to the trace viewer (CL 81315). Change-Id: Iaed723d4a6e8c2ffb7c0c48fbac1688b00b30f01 Reviewed-on: https://go-review.googlesource.com/81655 Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src/cmd')
-rw-r--r--src/cmd/internal/objabi/funcid.go4
-rw-r--r--src/cmd/link/internal/ld/pcln.go8
-rw-r--r--src/cmd/trace/trace.go8
3 files changed, 10 insertions, 10 deletions
diff --git a/src/cmd/internal/objabi/funcid.go b/src/cmd/internal/objabi/funcid.go
index 55f1328ba8..ff75d3d571 100644
--- a/src/cmd/internal/objabi/funcid.go
+++ b/src/cmd/internal/objabi/funcid.go
@@ -13,6 +13,7 @@ type FuncID uint32
const (
FuncID_normal FuncID = iota // not a special function
+ FuncID_runtime_main
FuncID_goexit
FuncID_jmpdefer
FuncID_mcall
@@ -22,9 +23,6 @@ const (
FuncID_asmcgocall
FuncID_sigpanic
FuncID_runfinq
- FuncID_bgsweep
- FuncID_forcegchelper
- FuncID_timerproc
FuncID_gcBgMarkWorker
FuncID_systemstack_switch
FuncID_systemstack
diff --git a/src/cmd/link/internal/ld/pcln.go b/src/cmd/link/internal/ld/pcln.go
index 446f64bdbc..1bd4d1d762 100644
--- a/src/cmd/link/internal/ld/pcln.go
+++ b/src/cmd/link/internal/ld/pcln.go
@@ -312,6 +312,8 @@ func (ctxt *Link) pclntab() {
// funcID uint32
funcID := objabi.FuncID_normal
switch s.Name {
+ case "runtime.main":
+ funcID = objabi.FuncID_runtime_main
case "runtime.goexit":
funcID = objabi.FuncID_goexit
case "runtime.jmpdefer":
@@ -330,12 +332,6 @@ func (ctxt *Link) pclntab() {
funcID = objabi.FuncID_sigpanic
case "runtime.runfinq":
funcID = objabi.FuncID_runfinq
- case "runtime.bgsweep":
- funcID = objabi.FuncID_bgsweep
- case "runtime.forcegchelper":
- funcID = objabi.FuncID_forcegchelper
- case "runtime.timerproc":
- funcID = objabi.FuncID_timerproc
case "runtime.gcBgMarkWorker":
funcID = objabi.FuncID_gcBgMarkWorker
case "runtime.systemstack_switch":
diff --git a/src/cmd/trace/trace.go b/src/cmd/trace/trace.go
index 7a61d5b412..fcba0cbc3f 100644
--- a/src/cmd/trace/trace.go
+++ b/src/cmd/trace/trace.go
@@ -576,7 +576,7 @@ func generateTrace(params *traceParams, consumer traceConsumer) error {
fname := stk[0].Fn
info.name = fmt.Sprintf("G%v %s", newG, fname)
- info.isSystemG = strings.HasPrefix(fname, "runtime.") && fname != "runtime.main"
+ info.isSystemG = isSystemGoroutine(fname)
ctx.gcount++
setGState(ev, newG, gDead, gRunnable)
@@ -1125,6 +1125,12 @@ func (ctx *traceContext) buildBranch(parent frameNode, stk []*trace.Frame) int {
return ctx.buildBranch(node, stk)
}
+func isSystemGoroutine(entryFn string) bool {
+ // This mimics runtime.isSystemGoroutine as closely as
+ // possible.
+ return entryFn != "runtime.main" && strings.HasPrefix(entryFn, "runtime.")
+}
+
// firstTimestamp returns the timestamp of the first event record.
func firstTimestamp() int64 {
res, _ := parseTrace()