var trace … var traceAdvanceSema … var traceShutdownSema … // StartTrace enables tracing for the current process. // While tracing, the data will be buffered and available via [ReadTrace]. // StartTrace returns an error if tracing is already enabled. // Most clients should use the [runtime/trace] package or the [testing] package's // -test.trace flag instead of calling StartTrace directly. func StartTrace() error { … } // StopTrace stops tracing, if it was previously enabled. // StopTrace only returns after all the reads for the trace have completed. func StopTrace() { … } // traceAdvance moves tracing to the next generation, and cleans up the current generation, // ensuring that it's flushed out before returning. If stopTrace is true, it disables tracing // altogether instead of advancing to the next generation. // // traceAdvanceSema must not be held. // // traceAdvance is called by golang.org/x/exp/trace using linkname. // //go:linkname traceAdvance func traceAdvance(stopTrace bool) { … } func traceNextGen(gen uintptr) uintptr { … } // traceRegisterLabelsAndReasons re-registers mark worker labels and // goroutine stop/block reasons in the string table for the provided // generation. Note: the provided generation must not have started yet. func traceRegisterLabelsAndReasons(gen uintptr) { … } // ReadTrace returns the next chunk of binary tracing data, blocking until data // is available. If tracing is turned off and all the data accumulated while it // was on has been returned, ReadTrace returns nil. The caller must copy the // returned data before calling ReadTrace again. // ReadTrace must be called from one goroutine at a time. func ReadTrace() []byte { … } // readTrace0 is ReadTrace's continuation on g0. This must run on the // system stack because it acquires trace.lock. // //go:systemstack func readTrace0() (buf []byte, park bool) { … } // traceReader returns the trace reader that should be woken up, if any. // Callers should first check (traceEnabled() || traceShuttingDown()). // // This must run on the system stack because it acquires trace.lock. // //go:systemstack func traceReader() *g { … } // traceReaderAvailable returns the trace reader if it is not currently // scheduled and should be. Callers should first check that // (traceEnabled() || traceShuttingDown()) is true. func traceReaderAvailable() *g { … } var traceAdvancer … type traceAdvancerState … // start starts a new traceAdvancer. func (s *traceAdvancerState) start() { … } // stop stops a traceAdvancer and blocks until it exits. func (s *traceAdvancerState) stop() { … } const defaultTraceAdvancePeriod … type wakeableSleep … // newWakeableSleep initializes a new wakeableSleep and returns it. func newWakeableSleep() *wakeableSleep { … } // sleep sleeps for the provided duration in nanoseconds or until // another goroutine calls wake. // // Must not be called by more than one goroutine at a time and // must not be called concurrently with close. func (s *wakeableSleep) sleep(ns int64) { … } // wake awakens any goroutine sleeping on the timer. // // Safe for concurrent use with all other methods. func (s *wakeableSleep) wake() { … } // close wakes any goroutine sleeping on the timer and prevents // further sleeping on it. // // Once close is called, the wakeableSleep must no longer be used. // // It must only be called once no goroutine is sleeping on the // timer *and* nothing else will call wake concurrently. func (s *wakeableSleep) close() { … }