package runtime
import (
)
type lfstack uint64
func ( *lfstack) ( *lfnode) {
.pushcnt++
:= lfstackPack(, .pushcnt)
if := lfstackUnpack(); != {
print("runtime: lfstack.push invalid packing: node=", , " cnt=", hex(.pushcnt), " packed=", hex(), " -> node=", , "\n")
throw("lfstack.push")
}
for {
:= atomic.Load64((*uint64)())
.next =
if atomic.Cas64((*uint64)(), , ) {
break
}
}
}
func ( *lfstack) () unsafe.Pointer {
for {
:= atomic.Load64((*uint64)())
if == 0 {
return nil
}
:= lfstackUnpack()
:= atomic.Load64(&.next)
if atomic.Cas64((*uint64)(), , ) {
return unsafe.Pointer()
}
}
}
func ( *lfstack) () bool {
return atomic.Load64((*uint64)()) == 0
}
func ( *lfnode) {
if , , := findObject(uintptr(unsafe.Pointer()), 0, 0); != 0 {
throw("lfstack node allocated from the heap")
}
if lfstackUnpack(lfstackPack(, ^uintptr(0))) != {
printlock()
println("runtime: bad lfnode address", hex(uintptr(unsafe.Pointer())))
throw("bad lfnode address")
}
}
func ( *lfnode, uintptr) uint64 {
return uint64(taggedPointerPack(unsafe.Pointer(), ))
}
func ( uint64) *lfnode {
return (*lfnode)(taggedPointer().pointer())
}