// Copyright 2023 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 main import ( "fmt" "internal/trace" "internal/trace/traceviewer" "time" ) // viewerFrames returns the frames of the stack of ev. The given frame slice is // used to store the frames to reduce allocations. func viewerFrames(stk trace.Stack) []*trace.Frame { var frames []*trace.Frame stk.Frames(func(f trace.StackFrame) bool { frames = append(frames, &trace.Frame{ PC: f.PC, Fn: f.Func, File: f.File, Line: int(f.Line), }) return true }) return frames } func viewerGState(state trace.GoState, inMarkAssist bool) traceviewer.GState { switch state { case trace.GoUndetermined: return traceviewer.GDead case trace.GoNotExist: return traceviewer.GDead case trace.GoRunnable: return traceviewer.GRunnable case trace.GoRunning: return traceviewer.GRunning case trace.GoWaiting: if inMarkAssist { return traceviewer.GWaitingGC } return traceviewer.GWaiting case trace.GoSyscall: // N.B. A goroutine in a syscall is considered "executing" (state.Executing() == true). return traceviewer.GRunning default: panic(fmt.Sprintf("unknown GoState: %s", state.String())) } } func viewerTime(t time.Duration) float64 { return float64(t) / float64(time.Microsecond) }