summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/runtime/proc.go7
-rw-r--r--src/runtime/trace.go13
2 files changed, 14 insertions, 6 deletions
diff --git a/src/runtime/proc.go b/src/runtime/proc.go
index 2c8750a5fe..b5e1c3e3b1 100644
--- a/src/runtime/proc.go
+++ b/src/runtime/proc.go
@@ -2004,12 +2004,7 @@ func oneNewExtraM() {
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 fd3ee273a3..27d58c2217 100644
--- a/src/runtime/trace.go
+++ b/src/runtime/trace.go
@@ -1713,3 +1713,16 @@ func startPCforTrace(pc uintptr) uintptr {
}
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)
+}