diff options
Diffstat (limited to 'libgo/go/runtime/mprof.go')
-rw-r--r-- | libgo/go/runtime/mprof.go | 41 |
1 files changed, 32 insertions, 9 deletions
diff --git a/libgo/go/runtime/mprof.go b/libgo/go/runtime/mprof.go index dd257d1..a4b135d 100644 --- a/libgo/go/runtime/mprof.go +++ b/libgo/go/runtime/mprof.go @@ -942,13 +942,16 @@ func ThreadCreateProfile(p []StackRecord) (n int, ok bool) { return } -// GoroutineProfile returns n, the number of records in the active goroutine stack profile. -// If len(p) >= n, GoroutineProfile copies the profile into p and returns n, true. -// If len(p) < n, GoroutineProfile does not change p and returns n, false. -// -// Most clients should use the runtime/pprof package instead -// of calling GoroutineProfile directly. -func GoroutineProfile(p []StackRecord) (n int, ok bool) { +//go:linkname runtime_goroutineProfileWithLabels runtime..z2fpprof.runtime_goroutineProfileWithLabels +func runtime_goroutineProfileWithLabels(p []StackRecord, labels []unsafe.Pointer) (n int, ok bool) { + return goroutineProfileWithLabels(p, labels) +} + +// labels may be nil. If labels is non-nil, it must have the same length as p. +func goroutineProfileWithLabels(p []StackRecord, labels []unsafe.Pointer) (n int, ok bool) { + if labels != nil && len(labels) != len(p) { + labels = nil + } gp := getg() isOK := func(gp1 *g) bool { @@ -968,12 +971,18 @@ func GoroutineProfile(p []StackRecord) (n int, ok bool) { if n <= len(p) { ok = true - r := p + r, lbl := p, labels // Save current goroutine. saveg(gp, &r[0]) r = r[1:] + // If we have a place to put our goroutine labelmap, insert it there. + if labels != nil { + lbl[0] = gp.labels + lbl = lbl[1:] + } + // Save other goroutines. for _, gp1 := range allgs { if isOK(gp1) { @@ -983,16 +992,30 @@ func GoroutineProfile(p []StackRecord) (n int, ok bool) { break } saveg(gp1, &r[0]) + if labels != nil { + lbl[0] = gp1.labels + lbl = lbl[1:] + } r = r[1:] } } } startTheWorld() - return n, ok } +// GoroutineProfile returns n, the number of records in the active goroutine stack profile. +// If len(p) >= n, GoroutineProfile copies the profile into p and returns n, true. +// If len(p) < n, GoroutineProfile does not change p and returns n, false. +// +// Most clients should use the runtime/pprof package instead +// of calling GoroutineProfile directly. +func GoroutineProfile(p []StackRecord) (n int, ok bool) { + + return goroutineProfileWithLabels(p, nil) +} + func saveg(gp *g, r *StackRecord) { if gp == getg() { var locbuf [32]location |