From: David Symonds Date: Mon, 5 Mar 2012 22:13:26 +0000 (+1100) Subject: expvar: add locking to String, and use RWMutex properly throughout. X-Git-Tag: weekly.2012-03-13~214 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=63e383cff81a590c36be0791ebdbc5fc50b98faf;p=gostls13.git expvar: add locking to String, and use RWMutex properly throughout. R=bradfitz CC=golang-dev https://golang.org/cl/5754043 --- diff --git a/src/pkg/expvar/expvar.go b/src/pkg/expvar/expvar.go index af5ce61aba..b06599505f 100644 --- a/src/pkg/expvar/expvar.go +++ b/src/pkg/expvar/expvar.go @@ -41,12 +41,12 @@ type Var interface { // Int is a 64-bit integer variable that satisfies the Var interface. type Int struct { i int64 - mu sync.Mutex + mu sync.RWMutex } func (v *Int) String() string { - v.mu.Lock() - defer v.mu.Unlock() + v.mu.RLock() + defer v.mu.RUnlock() return strconv.FormatInt(v.i, 10) } @@ -65,12 +65,12 @@ func (v *Int) Set(value int64) { // Float is a 64-bit float variable that satisfies the Var interface. type Float struct { f float64 - mu sync.Mutex + mu sync.RWMutex } func (v *Float) String() string { - v.mu.Lock() - defer v.mu.Unlock() + v.mu.RLock() + defer v.mu.RUnlock() return strconv.FormatFloat(v.f, 'g', -1, 64) } @@ -188,12 +188,21 @@ func (v *Map) Do(f func(KeyValue)) { // String is a string variable, and satisfies the Var interface. type String struct { - s string + s string + mu sync.RWMutex } -func (v *String) String() string { return strconv.Quote(v.s) } +func (v *String) String() string { + v.mu.RLock() + defer v.mu.RUnlock() + return strconv.Quote(v.s) +} -func (v *String) Set(value string) { v.s = value } +func (v *String) Set(value string) { + v.mu.Lock() + defer v.mu.Unlock() + v.s = value +} // Func implements Var by calling the function // and formatting the returned value using JSON.