atomicbool.go 612 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. package syncx
  2. import "sync/atomic"
  3. type AtomicBool uint32
  4. func NewAtomicBool() *AtomicBool {
  5. return new(AtomicBool)
  6. }
  7. func ForAtomicBool(val bool) *AtomicBool {
  8. b := NewAtomicBool()
  9. b.Set(val)
  10. return b
  11. }
  12. func (b *AtomicBool) CompareAndSwap(old, val bool) bool {
  13. var ov, nv uint32
  14. if old {
  15. ov = 1
  16. }
  17. if val {
  18. nv = 1
  19. }
  20. return atomic.CompareAndSwapUint32((*uint32)(b), ov, nv)
  21. }
  22. func (b *AtomicBool) Set(v bool) {
  23. if v {
  24. atomic.StoreUint32((*uint32)(b), 1)
  25. } else {
  26. atomic.StoreUint32((*uint32)(b), 0)
  27. }
  28. }
  29. func (b *AtomicBool) True() bool {
  30. return atomic.LoadUint32((*uint32)(b)) == 1
  31. }