safe atomic ints for rpi3, #269

This commit is contained in:
Josh Baker 2018-03-06 22:02:38 -07:00
parent 82197faea0
commit dc30f35646
1 changed files with 11 additions and 8 deletions

View File

@ -6,28 +6,31 @@ import (
"time" "time"
) )
type aint struct{ v int64 } type aint struct{ v uintptr }
func (a *aint) add(d int) int { func (a *aint) add(d int) int {
return int(atomic.AddInt64(&a.v, int64(d))) if d < 0 {
return int(atomic.AddUintptr(&a.v, ^uintptr(d-1)))
}
return int(atomic.AddUintptr(&a.v, uintptr(d)))
} }
func (a *aint) get() int { func (a *aint) get() int {
return int(atomic.LoadInt64(&a.v)) return int(atomic.LoadUintptr(&a.v))
} }
func (a *aint) set(i int) int { func (a *aint) set(i int) int {
return int(atomic.SwapInt64(&a.v, int64(i))) return int(atomic.SwapUintptr(&a.v, uintptr(i)))
} }
type abool struct{ v int64 } type abool struct{ v uint32 }
func (a *abool) on() bool { func (a *abool) on() bool {
return atomic.LoadInt64(&a.v) != 0 return atomic.LoadUint32(&a.v) != 0
} }
func (a *abool) set(t bool) bool { func (a *abool) set(t bool) bool {
if t { if t {
return atomic.SwapInt64(&a.v, 1) != 0 return atomic.SwapUint32(&a.v, 1) != 0
} }
return atomic.SwapInt64(&a.v, 0) != 0 return atomic.SwapUint32(&a.v, 0) != 0
} }
type astring struct { type astring struct {