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  }