1// Copyright 2023 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 5package main 6 7import ( 8 "fmt" 9 "internal/trace" 10 "internal/trace/traceviewer" 11 "time" 12) 13 14// viewerFrames returns the frames of the stack of ev. The given frame slice is 15// used to store the frames to reduce allocations. 16func viewerFrames(stk trace.Stack) []*trace.Frame { 17 var frames []*trace.Frame 18 stk.Frames(func(f trace.StackFrame) bool { 19 frames = append(frames, &trace.Frame{ 20 PC: f.PC, 21 Fn: f.Func, 22 File: f.File, 23 Line: int(f.Line), 24 }) 25 return true 26 }) 27 return frames 28} 29 30func viewerGState(state trace.GoState, inMarkAssist bool) traceviewer.GState { 31 switch state { 32 case trace.GoUndetermined: 33 return traceviewer.GDead 34 case trace.GoNotExist: 35 return traceviewer.GDead 36 case trace.GoRunnable: 37 return traceviewer.GRunnable 38 case trace.GoRunning: 39 return traceviewer.GRunning 40 case trace.GoWaiting: 41 if inMarkAssist { 42 return traceviewer.GWaitingGC 43 } 44 return traceviewer.GWaiting 45 case trace.GoSyscall: 46 // N.B. A goroutine in a syscall is considered "executing" (state.Executing() == true). 47 return traceviewer.GRunning 48 default: 49 panic(fmt.Sprintf("unknown GoState: %s", state.String())) 50 } 51} 52 53func viewerTime(t time.Duration) float64 { 54 return float64(t) / float64(time.Microsecond) 55} 56