From 666f5b4a89c52901c26b992a05fd54479fd6fad9 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Tue, 18 Mar 2014 11:38:39 -0700 Subject: [PATCH] expvar: don't recursively acquire Map.RLock Fixes #7575 LGTM=iant R=dvyukov, iant CC=golang-codereviews https://golang.org/cl/77540044 --- src/pkg/expvar/expvar.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/pkg/expvar/expvar.go b/src/pkg/expvar/expvar.go index c590782a8d..3abc65c407 100644 --- a/src/pkg/expvar/expvar.go +++ b/src/pkg/expvar/expvar.go @@ -108,7 +108,7 @@ func (v *Map) String() string { var b bytes.Buffer fmt.Fprintf(&b, "{") first := true - v.Do(func(kv KeyValue) { + v.doLocked(func(kv KeyValue) { if !first { fmt.Fprintf(&b, ", ") } @@ -202,6 +202,12 @@ func (v *Map) AddFloat(key string, delta float64) { func (v *Map) Do(f func(KeyValue)) { v.mu.RLock() defer v.mu.RUnlock() + v.doLocked(f) +} + +// doRLocked calls f for each entry in the map. +// v.mu must be held for reads. +func (v *Map) doLocked(f func(KeyValue)) { for _, k := range v.keys { f(KeyValue{k, v.m[k]}) } -- 2.48.1