aboutsummaryrefslogtreecommitdiffstats
path: root/library/go/x/xruntime/stacktrace.go
diff options
context:
space:
mode:
authoruzhas <uzhas@ydb.tech>2023-08-24 17:35:21 +0300
committeruzhas <uzhas@ydb.tech>2023-08-24 17:53:39 +0300
commitde6e39881d059d67cbcc978d076d9e3e5e9732fc (patch)
treecdf4e77c0156fe7f192d644883954f302fc56c01 /library/go/x/xruntime/stacktrace.go
parentb890c9f4f00efbc099a862b70c1dbc4c7db3dd2f (diff)
downloadydb-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.go69
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
+}