diff --git a/README.md b/README.md index c13a511..8d83a7e 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ cond.IsSet() // Returns true cond.UnSet() // Set to false cond.SetTo(true) // Set to whatever you want cond.SetToIf(false, true) // Set to true if it is false, returns false(not set) -cond.Flip() // Flip toggles the value(replaces with its opposite value) +cond.Toggle() bool // Toggle the boolean value atomically and returns the previous value. // embedding @@ -34,21 +34,21 @@ type Foo struct { ```shell # Read -BenchmarkMutexRead-4 100000000 21.0 ns/op +BenchmarkMutexRead-4 100000000 21.0 ns/op BenchmarkAtomicValueRead-4 200000000 6.30 ns/op BenchmarkAtomicBoolRead-4 300000000 4.21 ns/op # <--- This package # Write -BenchmarkMutexWrite-4 100000000 21.6 ns/op -BenchmarkAtomicValueWrite-4 30000000 43.4 ns/op +BenchmarkMutexWrite-4 100000000 21.6 ns/op +BenchmarkAtomicValueWrite-4 30000000 43.4 ns/op BenchmarkAtomicBoolWrite-4 200000000 9.87 ns/op # <--- This package # CAS -BenchmarkMutexCAS-4 30000000 44.9 ns/op -BenchmarkAtomicBoolCAS-4 100000000 11.7 ns/op # <--- This package +BenchmarkMutexCAS-4 30000000 44.9 ns/op +BenchmarkAtomicBoolCAS-4 100000000 11.7 ns/op # <--- This package -# Flip -BenchmarkMutexFlip-4 50000000 29.7 ns/op -BenchmarkAtomicBoolFlip-4 200000000 8.65 ns/op # <--- This package +# Toggle +BenchmarkMutexToggle-4 50000000 30.7 ns/op +BenchmarkAtomicBoolToggle-4 300000000 5.27 ns/op # <--- This package ``` diff --git a/bool.go b/bool.go index a57358a..7448c67 100644 --- a/bool.go +++ b/bool.go @@ -49,13 +49,9 @@ func (ab *AtomicBool) SetTo(yes bool) { } } -// Flip toggles the Boolean (replaces with its opposite value). -func (ab *AtomicBool) Flip() { - var o, n int32 - o, n = 0, 1 - if !atomic.CompareAndSwapInt32((*int32)(ab), o, n) { - atomic.CompareAndSwapInt32((*int32)(ab), n, o) - } +// Toggle negates boolean atomically and returns the previous value. +func (ab *AtomicBool) Toggle() bool { + return (atomic.AddInt32((*int32)(ab), 1)-1)&1 == 1 } // SetToIf sets the Boolean to new only if the Boolean matches the old diff --git a/bool_test.go b/bool_test.go index 6d83431..2e9b4f0 100644 --- a/bool_test.go +++ b/bool_test.go @@ -50,9 +50,9 @@ func TestBool(t *testing.T) { t.Fatal("AtomicBool.SetTo(false, true) failed") } - v.Flip() // expected false + _ = v.Toggle() // expected false if v.IsSet() { - t.Fatal("AtomicBool.Flip() failed") + t.Fatal("AtomicBool.Toggle() failed") } } @@ -90,7 +90,7 @@ func TestRace(t *testing.T) { // Reader And Writer go func() { for i := 0; i < repeat; i++ { - v.Flip() + v.Toggle() wg.Done() } }() @@ -104,7 +104,7 @@ func ExampleAtomicBool() { cond.IsSet() // returns true cond.UnSet() // set to false cond.SetTo(true) // set to whatever you want - cond.Flip() // flips the boolean value + cond.Toggle() // toggles the boolean value } // Benchmark Read @@ -191,9 +191,9 @@ func BenchmarkAtomicBoolCAS(b *testing.B) { } } -// Benchmark flip boolean value +// Benchmark toggle boolean value -func BenchmarkMutexFlip(b *testing.B) { +func BenchmarkMutexToggle(b *testing.B) { var m sync.RWMutex var v bool b.ResetTimer() @@ -205,10 +205,10 @@ func BenchmarkMutexFlip(b *testing.B) { b.StopTimer() } -func BenchmarkAtomicBoolFlip(b *testing.B) { +func BenchmarkAtomicBoolToggle(b *testing.B) { v := New() b.ResetTimer() for i := 0; i < b.N; i++ { - v.Flip() + v.Toggle() } }