diff options
author | Austin Clements <austin@google.com> | 2017-12-01 16:13:08 -0500 |
---|---|---|
committer | Austin Clements <austin@google.com> | 2018-05-07 21:38:40 +0000 |
commit | 44286b17c5ca6673648ba57b4a9d49ab8dffedf6 (patch) | |
tree | 19e9be51dced2da66cd7b6fb8cdd67aed045a39d /src/cmd/trace | |
parent | a8a050819bd4693ea7c6fdc1744038f172c2a439 (diff) | |
download | go-44286b17c5ca6673648ba57b4a9d49ab8dffedf6.tar.gz go-44286b17c5ca6673648ba57b4a9d49ab8dffedf6.zip |
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/trace')
-rw-r--r-- | src/cmd/trace/trace.go | 8 |
1 files changed, 7 insertions, 1 deletions
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() |