package runtime
import (
)
type lfstack uint64
func ( *lfstack) ( *lfnode) {
.pushcnt++
:= lfstackPack(, .pushcnt)
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")
}
lfstackPack(, ^uintptr(0))
}
func ( *lfnode, uintptr) uint64 {
return uint64(taggedPointerPack(unsafe.Pointer(), &(1<<tagBits-1)))
}
func ( uint64) *lfnode {
return (*lfnode)(taggedPointer().pointer())
}