Skip to content

Commit

Permalink
expvar: convert f to atomic type
Browse files Browse the repository at this point in the history
Signed-off-by: cui fliter <imcusg@gmail.com>
  • Loading branch information
cuishuang committed Sep 4, 2022
1 parent 535fe2b commit b67ddf8
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 8 deletions.
12 changes: 6 additions & 6 deletions src/expvar/expvar.go
Expand Up @@ -67,34 +67,34 @@ func (v *Int) Set(value int64) {

// Float is a 64-bit float variable that satisfies the Var interface.
type Float struct {
f uint64
f atomic.Uint64
}

func (v *Float) Value() float64 {
return math.Float64frombits(atomic.LoadUint64(&v.f))
return math.Float64frombits(v.f.Load())
}

func (v *Float) String() string {
return strconv.FormatFloat(
math.Float64frombits(atomic.LoadUint64(&v.f)), 'g', -1, 64)
math.Float64frombits(v.f.Load()), 'g', -1, 64)
}

// Add adds delta to v.
func (v *Float) Add(delta float64) {
for {
cur := atomic.LoadUint64(&v.f)
cur := v.f.Load()
curVal := math.Float64frombits(cur)
nxtVal := curVal + delta
nxt := math.Float64bits(nxtVal)
if atomic.CompareAndSwapUint64(&v.f, cur, nxt) {
if v.f.CompareAndSwap(cur, nxt) {
return
}
}
}

// Set sets v to value.
func (v *Float) Set(value float64) {
atomic.StoreUint64(&v.f, math.Float64bits(value))
v.f.Store(math.Float64bits(value))
}

// Map is a string-to-Var map variable that satisfies the Var interface.
Expand Down
4 changes: 2 additions & 2 deletions src/expvar/expvar_test.go
Expand Up @@ -87,8 +87,8 @@ func BenchmarkIntSet(b *testing.B) {
func TestFloat(t *testing.T) {
RemoveAll()
reqs := NewFloat("requests-float")
if reqs.f != 0.0 {
t.Errorf("reqs.f = %v, want 0", reqs.f)
if reqs.f.Load() != 0.0 {
t.Errorf("reqs.f = %v, want 0", reqs.f.Load())
}
if reqs != Get("requests-float").(*Float) {
t.Errorf("Get() failed.")
Expand Down

0 comments on commit b67ddf8

Please sign in to comment.