]> Cypherpunks repositories - gostls13.git/commitdiff
expvar: don't recursively acquire Map.RLock
authorBrad Fitzpatrick <bradfitz@golang.org>
Tue, 18 Mar 2014 18:38:39 +0000 (11:38 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Tue, 18 Mar 2014 18:38:39 +0000 (11:38 -0700)
Fixes #7575

LGTM=iant
R=dvyukov, iant
CC=golang-codereviews
https://golang.org/cl/77540044

src/pkg/expvar/expvar.go

index c590782a8d266f0fad192cccfa009d51f248a919..3abc65c407b998b2e672931212e55e2dd0653fe1 100644 (file)
@@ -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]})
        }