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)) }