once.go 369 B

1234567891011121314151617181920212223242526272829
  1. package signal
  2. import (
  3. "sync"
  4. "sync/atomic"
  5. )
  6. type Once struct {
  7. m sync.Mutex
  8. done uint32
  9. }
  10. func (o *Once) Do(f func()) {
  11. if atomic.LoadUint32(&o.done) == 1 {
  12. return
  13. }
  14. o.m.Lock()
  15. defer o.m.Unlock()
  16. if o.done == 0 {
  17. atomic.StoreUint32(&o.done, 1)
  18. f()
  19. }
  20. }
  21. func (o *Once) Reset() {
  22. o.m.Lock()
  23. defer o.m.Unlock()
  24. atomic.StoreUint32(&o.done, 0)
  25. }