mirror of https://github.com/golang/go.git
69 lines
2.4 KiB
Go
69 lines
2.4 KiB
Go
// Copyright 2024 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package runtime
|
|
|
|
// traceExpWriter is a wrapper around trace writer that produces traceEvExperimentalBatch
|
|
// batches. This means that the data written to the writer need not conform to the standard
|
|
// trace format.
|
|
type traceExpWriter struct {
|
|
traceWriter
|
|
exp traceExperiment
|
|
}
|
|
|
|
// unsafeTraceExpWriter produces a traceExpWriter that doesn't lock the trace.
|
|
//
|
|
// It should only be used in contexts where either:
|
|
// - Another traceLocker is held.
|
|
// - trace.gen is prevented from advancing.
|
|
//
|
|
// buf may be nil.
|
|
func unsafeTraceExpWriter(gen uintptr, buf *traceBuf, exp traceExperiment) traceExpWriter {
|
|
return traceExpWriter{traceWriter{traceLocker: traceLocker{gen: gen}, traceBuf: buf}, exp}
|
|
}
|
|
|
|
// ensure makes sure that at least maxSize bytes are available to write.
|
|
//
|
|
// Returns whether the buffer was flushed.
|
|
func (w traceExpWriter) ensure(maxSize int) (traceExpWriter, bool) {
|
|
refill := w.traceBuf == nil || !w.available(maxSize)
|
|
if refill {
|
|
w.traceWriter = w.traceWriter.refill(w.exp)
|
|
}
|
|
return w, refill
|
|
}
|
|
|
|
// traceExperiment is an enumeration of the different kinds of experiments supported for tracing.
|
|
type traceExperiment uint8
|
|
|
|
const (
|
|
// traceNoExperiment indicates no experiment.
|
|
traceNoExperiment traceExperiment = iota
|
|
|
|
// traceExperimentAllocFree is an experiment to add alloc/free events to the trace.
|
|
traceExperimentAllocFree
|
|
)
|
|
|
|
// Experimental events.
|
|
const (
|
|
_ traceEv = 127 + iota
|
|
|
|
// Experimental events for ExperimentAllocFree.
|
|
|
|
// Experimental heap span events. IDs map reversibly to base addresses.
|
|
traceEvSpan // heap span exists [timestamp, id, npages, type/class]
|
|
traceEvSpanAlloc // heap span alloc [timestamp, id, npages, type/class]
|
|
traceEvSpanFree // heap span free [timestamp, id]
|
|
|
|
// Experimental heap object events. IDs map reversibly to addresses.
|
|
traceEvHeapObject // heap object exists [timestamp, id, type]
|
|
traceEvHeapObjectAlloc // heap object alloc [timestamp, id, type]
|
|
traceEvHeapObjectFree // heap object free [timestamp, id]
|
|
|
|
// Experimental goroutine stack events. IDs map reversibly to addresses.
|
|
traceEvGoroutineStack // stack exists [timestamp, id, order]
|
|
traceEvGoroutineStackAlloc // stack alloc [timestamp, id, order]
|
|
traceEvGoroutineStackFree // stack free [timestamp, id]
|
|
)
|