From: Brad Fitzpatrick Date: Tue, 18 Mar 2014 18:38:39 +0000 (-0700) Subject: expvar: don't recursively acquire Map.RLock X-Git-Tag: go1.3beta1~331 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=666f5b4a89c52901c26b992a05fd54479fd6fad9;p=gostls13.git expvar: don't recursively acquire Map.RLock Fixes #7575 LGTM=iant R=dvyukov, iant CC=golang-codereviews https://golang.org/cl/77540044 --- 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]}) }