runtime: factor our oneNewExtraM trace code In the interest of further cleaning up the trace.go API, move the trace logic in oneNewExtraM into its own function. Change-Id: I5cf478cb8cd0d301ee3b068347ed48ce768b8882 Reviewed-on: https://go-review.googlesource.com/c/go/+/494186 Reviewed-by: Michael Pratt <mpratt@google.com> Run-TryBot: Michael Knyszek <mknyszek@google.com> Auto-Submit: Michael Knyszek <mknyszek@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
diff --git a/src/runtime/proc.go b/src/runtime/proc.go index 2c8750a..b5e1c3e 100644 --- a/src/runtime/proc.go +++ b/src/runtime/proc.go
@@ -2004,12 +2004,7 @@ gp.racectx = racegostart(abi.FuncPCABIInternal(newextram) + sys.PCQuantum) } if traceEnabled() { - // Trigger two trace events for the locked g in the extra m, - // since the next event of the g will be traceEvGoSysExit in exitsyscall, - // while calling from C thread to Go. - traceGoCreate(gp, 0) // no start pc - gp.traceseq++ - traceEvent(traceEvGoInSyscall, -1, gp.goid) + traceOneNewExtraM(gp) } // put on allg for garbage collector allgadd(gp)
diff --git a/src/runtime/trace.go b/src/runtime/trace.go index fd3ee27..27d58c2 100644 --- a/src/runtime/trace.go +++ b/src/runtime/trace.go
@@ -1713,3 +1713,16 @@ } return f.datap.textAddr(*(*uint32)(w)) } + +// traceOneNewExtraM registers the fact that a new extra M was created with +// the tracer. This matters if the M (which has an attached G) is used while +// the trace is still active because if it is, we need the fact that it exists +// to show up in the final trace. +func traceOneNewExtraM(gp *g) { + // Trigger two trace events for the locked g in the extra m, + // since the next event of the g will be traceEvGoSysExit in exitsyscall, + // while calling from C thread to Go. + traceGoCreate(gp, 0) // no start pc + gp.traceseq++ + traceEvent(traceEvGoInSyscall, -1, gp.goid) +}