summaryrefslogtreecommitdiff
path: root/src/internal/pkgbits/sync.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/internal/pkgbits/sync.go')
-rw-r--r--src/internal/pkgbits/sync.go19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/internal/pkgbits/sync.go b/src/internal/pkgbits/sync.go
index a17a0088f7..1520b73afb 100644
--- a/src/internal/pkgbits/sync.go
+++ b/src/internal/pkgbits/sync.go
@@ -6,6 +6,7 @@ package pkgbits
import (
"fmt"
+ "runtime"
"strings"
)
@@ -23,6 +24,24 @@ func fmtFrames(pcs ...uintptr) []string {
type frameVisitor func(file string, line int, name string, offset uintptr)
+// walkFrames calls visit for each call frame represented by pcs.
+//
+// pcs should be a slice of PCs, as returned by runtime.Callers.
+func walkFrames(pcs []uintptr, visit frameVisitor) {
+ if len(pcs) == 0 {
+ return
+ }
+
+ frames := runtime.CallersFrames(pcs)
+ for {
+ frame, more := frames.Next()
+ visit(frame.File, frame.Line, frame.Function, frame.PC-frame.Entry)
+ if !more {
+ return
+ }
+ }
+}
+
// SyncMarker is an enum type that represents markers that may be
// written to export data to ensure the reader and writer stay
// synchronized.