// 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] )