1package controller 2 3import ( 4 "sync" 5 "sync/atomic" 6 "time" 7) 8 9type aint struct{ v uintptr } 10 11func (a *aint) add(d int) int { 12 if d < 0 { 13 return int(atomic.AddUintptr(&a.v, ^uintptr((d*-1)-1))) 14 } 15 return int(atomic.AddUintptr(&a.v, uintptr(d))) 16} 17func (a *aint) get() int { 18 return int(atomic.LoadUintptr(&a.v)) 19} 20func (a *aint) set(i int) int { 21 return int(atomic.SwapUintptr(&a.v, uintptr(i))) 22} 23 24type abool struct{ v uint32 } 25 26func (a *abool) on() bool { 27 return atomic.LoadUint32(&a.v) != 0 28} 29func (a *abool) set(t bool) bool { 30 if t { 31 return atomic.SwapUint32(&a.v, 1) != 0 32 } 33 return atomic.SwapUint32(&a.v, 0) != 0 34} 35 36type astring struct { 37 mu sync.Mutex 38 v string 39} 40 41func (a *astring) get() string { 42 a.mu.Lock() 43 p := a.v 44 a.mu.Unlock() 45 return p 46} 47func (a *astring) set(s string) string { 48 a.mu.Lock() 49 p := a.v 50 a.v = s 51 a.mu.Unlock() 52 return p 53} 54 55type atime struct { 56 mu sync.Mutex 57 v time.Time 58} 59 60func (a *atime) get() time.Time { 61 a.mu.Lock() 62 p := a.v 63 a.mu.Unlock() 64 return p 65} 66func (a *atime) set(t time.Time) time.Time { 67 a.mu.Lock() 68 p := a.v 69 a.v = t 70 a.mu.Unlock() 71 return p 72} 73