tile38/internal/server/atomic.go

33 lines
609 B
Go
Raw Permalink Normal View History

package server
2017-09-30 17:29:03 +03:00
2017-09-30 18:00:29 +03:00
import (
"sync/atomic"
)
2017-09-30 17:29:03 +03:00
2018-03-07 08:02:38 +03:00
type aint struct{ v uintptr }
2017-09-30 17:29:03 +03:00
func (a *aint) add(d int) int {
2018-03-07 08:02:38 +03:00
if d < 0 {
2018-03-07 08:07:38 +03:00
return int(atomic.AddUintptr(&a.v, ^uintptr((d*-1)-1)))
2018-03-07 08:02:38 +03:00
}
return int(atomic.AddUintptr(&a.v, uintptr(d)))
2017-09-30 17:29:03 +03:00
}
func (a *aint) get() int {
2018-03-07 08:02:38 +03:00
return int(atomic.LoadUintptr(&a.v))
2017-09-30 17:29:03 +03:00
}
func (a *aint) set(i int) int {
2018-03-07 08:02:38 +03:00
return int(atomic.SwapUintptr(&a.v, uintptr(i)))
2017-09-30 17:29:03 +03:00
}
2018-03-07 08:02:38 +03:00
type abool struct{ v uint32 }
2017-09-30 17:29:03 +03:00
func (a *abool) on() bool {
2018-03-07 08:02:38 +03:00
return atomic.LoadUint32(&a.v) != 0
2017-09-30 17:29:03 +03:00
}
func (a *abool) set(t bool) bool {
if t {
2018-03-07 08:02:38 +03:00
return atomic.SwapUint32(&a.v, 1) != 0
2017-09-30 17:29:03 +03:00
}
2018-03-07 08:02:38 +03:00
return atomic.SwapUint32(&a.v, 0) != 0
2017-09-30 17:29:03 +03:00
}