lockedExt uint32 // tracking for external LockOSThread
lockedInt uint32 // tracking for internal lockOSThread
nextwaitm muintptr // next m waiting for lock
+
+ // wait* are used to carry arguments from gopark into park_m, because
+ // there's no stack to put them on. That is their sole purpose.
waitunlockf func(*g, unsafe.Pointer) bool
waitlock unsafe.Pointer
waittraceev byte
waittraceskip int
- startingtrace bool
- syscalltick uint32
- freelink *m // on sched.freem
+
+ syscalltick uint32
+ freelink *m // on sched.freem
+ trace mTraceState
// these are here because they are too large to be on the stack
// of low-level NOSPLIT functions.
lastP puintptr // last P emitted an event for this goroutine
}
+// mTraceState is per-M state for the tracer.
+type mTraceState struct {
+ startingTrace bool // this M is in TraceStart, potentially before traceEnabled is true
+}
+
// traceLockInit initializes global trace locks.
func traceLockInit() {
lockInit(&trace.bufLock, lockRankTraceBuf)
// That would lead to an inconsistent trace:
// - either GoSysExit appears before EvGoInSyscall,
// - or GoSysExit appears for a goroutine for which we don't emit EvGoInSyscall below.
- // To instruct traceEvent that it must not ignore events below, we set startingtrace.
+ // To instruct traceEvent that it must not ignore events below, we set trace.startingTrace.
// trace.enabled is set afterwards once we have emitted all preliminary events.
mp := getg().m
- mp.startingtrace = true
+ mp.trace.startingTrace = true
// Obtain current stack ID to use in all traceEvGoCreate events below.
stkBuf := make([]uintptr, traceStackSize)
trace.strings = make(map[string]uint64)
trace.seqGC = 0
- mp.startingtrace = false
+ mp.trace.startingTrace = false
trace.enabled = true
// Register runtime goroutine labels.
// during tracing in exitsyscall is resolved by locking trace.bufLock in traceLockBuffer.
//
// Note trace_userTaskCreate runs the same check.
- if !trace.enabled && !mp.startingtrace {
+ if !trace.enabled && !mp.trace.startingTrace {
traceReleaseBuffer(mp, pid)
return
}
// Same as in traceEvent.
mp, pid, bufp := traceAcquireBuffer()
- if !trace.enabled && !mp.startingtrace {
+ if !trace.enabled && !mp.trace.startingTrace {
traceReleaseBuffer(mp, pid)
return
}
}
mp, pid, bufp := traceAcquireBuffer()
- if !trace.enabled && !mp.startingtrace {
+ if !trace.enabled && !mp.trace.startingTrace {
traceReleaseBuffer(mp, pid)
return
}
}
mp, pid, bufp := traceAcquireBuffer()
- if !trace.enabled && !mp.startingtrace {
+ if !trace.enabled && !mp.trace.startingTrace {
traceReleaseBuffer(mp, pid)
return
}