goirc/client/dispatch_unsafe.go

39 lines
1.0 KiB
Go

package client
import (
"sync/atomic"
"unsafe"
)
type hNodePtr struct {
ptr unsafe.Pointer
}
func (p *hNodePtr) load() *hNode {
return (*hNode)(atomic.LoadPointer(&p.ptr))
}
func (p *hNodePtr) store(new *hNode) {
atomic.StorePointer(&p.ptr, unsafe.Pointer(new))
}
func (p *hNodePtr) swap(new *hNode) (old *hNode) {
return (*hNode)(atomic.SwapPointer(&p.ptr, unsafe.Pointer(new)))
}
func (p *hNodePtr) compareAndSwap(old, new *hNode) (swapped bool) {
return atomic.CompareAndSwapPointer(&p.ptr, unsafe.Pointer(old), unsafe.Pointer(new))
}
type hNodeState uintptr
func (s *hNodeState) load() hNodeState {
return hNodeState(atomic.LoadUintptr((*uintptr)(s)))
}
func (s *hNodeState) store(new hNodeState) {
atomic.StoreUintptr((*uintptr)(s), uintptr(new))
}
func (s *hNodeState) swap(new hNodeState) (old hNodeState) {
return hNodeState(atomic.SwapUintptr((*uintptr)(s), uintptr(new)))
}
func (s *hNodeState) compareAndSwap(old, new hNodeState) (swapped bool) {
return atomic.CompareAndSwapUintptr((*uintptr)(s), uintptr(old), uintptr(new))
}