diff options
author | uzhas <uzhas@ydb.tech> | 2023-08-24 17:35:21 +0300 |
---|---|---|
committer | uzhas <uzhas@ydb.tech> | 2023-08-24 17:53:39 +0300 |
commit | de6e39881d059d67cbcc978d076d9e3e5e9732fc (patch) | |
tree | cdf4e77c0156fe7f192d644883954f302fc56c01 /library/go/x/xruntime/stacktrace.go | |
parent | b890c9f4f00efbc099a862b70c1dbc4c7db3dd2f (diff) | |
download | ydb-de6e39881d059d67cbcc978d076d9e3e5e9732fc.tar.gz |
move yql connector to ydb
move code
Diffstat (limited to 'library/go/x/xruntime/stacktrace.go')
-rw-r--r-- | library/go/x/xruntime/stacktrace.go | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/library/go/x/xruntime/stacktrace.go b/library/go/x/xruntime/stacktrace.go new file mode 100644 index 0000000000..5c5e661188 --- /dev/null +++ b/library/go/x/xruntime/stacktrace.go @@ -0,0 +1,69 @@ +package xruntime + +import ( + "runtime" +) + +type StackTrace struct { + frames []uintptr + full bool +} + +func NewStackTrace16(skip int) *StackTrace { + var pcs [16]uintptr + return newStackTrace(skip+2, pcs[:]) +} + +func NewStackTrace32(skip int) *StackTrace { + var pcs [32]uintptr + return newStackTrace(skip+2, pcs[:]) +} + +func NewStackTrace64(skip int) *StackTrace { + var pcs [64]uintptr + return newStackTrace(skip+2, pcs[:]) +} + +func NewStackTrace128(skip int) *StackTrace { + var pcs [128]uintptr + return newStackTrace(skip+2, pcs[:]) +} + +func newStackTrace(skip int, pcs []uintptr) *StackTrace { + n := runtime.Callers(skip+1, pcs) + return &StackTrace{frames: pcs[:n], full: true} +} + +func NewFrame(skip int) *StackTrace { + var pcs [3]uintptr + n := runtime.Callers(skip+1, pcs[:]) + return &StackTrace{frames: pcs[:n]} +} + +func (st *StackTrace) Frames() []runtime.Frame { + frames := runtime.CallersFrames(st.frames[:]) + if !st.full { + if _, ok := frames.Next(); !ok { + return nil + } + + fr, ok := frames.Next() + if !ok { + return nil + } + + return []runtime.Frame{fr} + } + + var res []runtime.Frame + for { + frame, more := frames.Next() + if !more { + break + } + + res = append(res, frame) + } + + return res +} |