github.com/ngicks/gokugen@v0.0.5/scheduler/state.go (about) 1 package scheduler 2 3 import "sync/atomic" 4 5 // workingState is togglable wroking state. 6 type workingState struct { 7 working uint32 8 } 9 10 func (s *workingState) setWorking(to ...bool) (swapped bool) { 11 setTo := true 12 for _, setState := range to { 13 if !setState { 14 setTo = false 15 } 16 } 17 if setTo { 18 return atomic.CompareAndSwapUint32(&s.working, 0, 1) 19 } else { 20 return atomic.CompareAndSwapUint32(&s.working, 1, 0) 21 } 22 } 23 24 func (s *workingState) IsWorking() bool { 25 return atomic.LoadUint32(&s.working) == 1 26 } 27 28 // endState is reprensentation of one-way only transition to end state. 29 type endState struct { 30 ended uint32 31 } 32 33 func (s *endState) setEnded() (swapped bool) { 34 return atomic.CompareAndSwapUint32(&s.ended, 0, 1) 35 } 36 37 func (s *endState) IsEnded() bool { 38 return atomic.LoadUint32(&s.ended) == 1 39 }