mirror of https://go.googlesource.com/go
56 lines
1.4 KiB
Go
56 lines
1.4 KiB
Go
// 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)
|
|
}
|