diff --git a/src/util/atomicbool.go b/src/util/atomicbool.go index 9e1bdc8..c5c7e69 100644 --- a/src/util/atomicbool.go +++ b/src/util/atomicbool.go @@ -1,32 +1,34 @@ package util -import "sync" +import ( + "sync/atomic" +) + +func convertBoolToInt32(b bool) int32 { + if b { + return 1 + } + return 0 +} // AtomicBool is a boxed-class that provides synchronized access to the // underlying boolean value type AtomicBool struct { - mutex sync.Mutex - state bool + state int32 // "1" is true, "0" is false } // NewAtomicBool returns a new AtomicBool func NewAtomicBool(initialState bool) *AtomicBool { - return &AtomicBool{ - mutex: sync.Mutex{}, - state: initialState} + return &AtomicBool{state: convertBoolToInt32(initialState)} } // Get returns the current boolean value synchronously func (a *AtomicBool) Get() bool { - a.mutex.Lock() - defer a.mutex.Unlock() - return a.state + return atomic.LoadInt32(&a.state) == 1 } // Set updates the boolean value synchronously func (a *AtomicBool) Set(newState bool) bool { - a.mutex.Lock() - defer a.mutex.Unlock() - a.state = newState - return a.state + atomic.StoreInt32(&a.state, convertBoolToInt32(newState)) + return newState }