blob: 9fc85df5a8e99acd44baff853bf3d89f8487f2f0 [file] [log] [blame]
// 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 {
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.
// 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]