github.com/loov/combiner@v0.1.0/node_unsafe.go (about) 1 package combiner 2 3 import ( 4 "sync/atomic" 5 "unsafe" 6 ) 7 8 type nodeptr = uintptr 9 10 type node struct { 11 next nodeptr // *next 12 argument interface{} 13 } 14 15 func (n *node) ref() nodeptr { return (nodeptr)(unsafe.Pointer(n)) } 16 17 const ( 18 locked = nodeptr(1) 19 handoffTag = nodeptr(2) 20 ) 21 22 func atomicLoadNodeptr(p *nodeptr) nodeptr { 23 return atomic.LoadUintptr(p) 24 } 25 func atomicStoreNodeptr(p *nodeptr, v nodeptr) { 26 atomic.StoreUintptr(p, v) 27 } 28 29 func atomicCompareAndSwapNodeptr(addr *uintptr, old, new uintptr) bool { 30 return atomic.CompareAndSwapUintptr(addr, old, new) 31 } 32 33 func nodeptrToNode(p nodeptr) *node { return (*node)(unsafe.Pointer(p)) }