Source file src/runtime/traceexp.go

     1  // Copyright 2024 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package runtime
     6  
     7  // traceExpWriter is a wrapper around trace writer that produces traceEvExperimentalBatch
     8  // batches. This means that the data written to the writer need not conform to the standard
     9  // trace format.
    10  type traceExpWriter struct {
    11  	traceWriter
    12  	exp traceExperiment
    13  }
    14  
    15  // unsafeTraceExpWriter produces a traceExpWriter that doesn't lock the trace.
    16  //
    17  // It should only be used in contexts where either:
    18  // - Another traceLocker is held.
    19  // - trace.gen is prevented from advancing.
    20  //
    21  // buf may be nil.
    22  func unsafeTraceExpWriter(gen uintptr, buf *traceBuf, exp traceExperiment) traceExpWriter {
    23  	return traceExpWriter{traceWriter{traceLocker: traceLocker{gen: gen}, traceBuf: buf}, exp}
    24  }
    25  
    26  // ensure makes sure that at least maxSize bytes are available to write.
    27  //
    28  // Returns whether the buffer was flushed.
    29  func (w traceExpWriter) ensure(maxSize int) (traceExpWriter, bool) {
    30  	refill := w.traceBuf == nil || !w.available(maxSize)
    31  	if refill {
    32  		w.traceWriter = w.traceWriter.refill(w.exp)
    33  	}
    34  	return w, refill
    35  }
    36  
    37  // traceExperiment is an enumeration of the different kinds of experiments supported for tracing.
    38  type traceExperiment uint8
    39  
    40  const (
    41  	// traceNoExperiment indicates no experiment.
    42  	traceNoExperiment traceExperiment = iota
    43  
    44  	// traceExperimentAllocFree is an experiment to add alloc/free events to the trace.
    45  	traceExperimentAllocFree
    46  )
    47  
    48  // Experimental events.
    49  const (
    50  	_ traceEv = 127 + iota
    51  
    52  	// Experimental events for ExperimentAllocFree.
    53  
    54  	// Experimental heap span events. IDs map reversibly to base addresses.
    55  	traceEvSpan      // heap span exists [timestamp, id, npages, type/class]
    56  	traceEvSpanAlloc // heap span alloc [timestamp, id, npages, type/class]
    57  	traceEvSpanFree  // heap span free [timestamp, id]
    58  
    59  	// Experimental heap object events. IDs map reversibly to addresses.
    60  	traceEvHeapObject      // heap object exists [timestamp, id, type]
    61  	traceEvHeapObjectAlloc // heap object alloc [timestamp, id, type]
    62  	traceEvHeapObjectFree  // heap object free [timestamp, id]
    63  
    64  	// Experimental goroutine stack events. IDs map reversibly to addresses.
    65  	traceEvGoroutineStack      // stack exists [timestamp, id, order]
    66  	traceEvGoroutineStackAlloc // stack alloc [timestamp, id, order]
    67  	traceEvGoroutineStackFree  // stack free [timestamp, id]
    68  )
    69  

View as plain text