package runtime
import (
)
func ( *uintptr) *uint32 {
return (*uint32)(unsafe.Pointer())
}
func ( *note) {
.key = 0
}
func ( *note) {
:= atomic.Xchg(key32(&.key), 1)
if != 0 {
print("notewakeup - double wakeup (", , ")\n")
throw("notewakeup - double wakeup")
}
futexwakeup(key32(&.key), 1)
}
func ( *note) {
:= getg()
if != .m.g0 {
throw("notesleep not on g0")
}
:= int64(-1)
if *cgo_yield != nil {
= 10e6
}
for atomic.Load(key32(&.key)) == 0 {
.m.blocked = true
futexsleep(key32(&.key), 0, )
if *cgo_yield != nil {
asmcgocall(*cgo_yield, nil)
}
.m.blocked = false
}
}
func ( *note, int64) bool {
:= getg()
if < 0 {
if *cgo_yield != nil {
= 10e6
}
for atomic.Load(key32(&.key)) == 0 {
.m.blocked = true
futexsleep(key32(&.key), 0, )
if *cgo_yield != nil {
asmcgocall(*cgo_yield, nil)
}
.m.blocked = false
}
return true
}
if atomic.Load(key32(&.key)) != 0 {
return true
}
:= nanotime() +
for {
if *cgo_yield != nil && > 10e6 {
= 10e6
}
.m.blocked = true
futexsleep(key32(&.key), 0, )
if *cgo_yield != nil {
asmcgocall(*cgo_yield, nil)
}
.m.blocked = false
if atomic.Load(key32(&.key)) != 0 {
break
}
:= nanotime()
if >= {
break
}
= -
}
return atomic.Load(key32(&.key)) != 0
}
func ( *note, int64) bool {
:= getg()
if != .m.g0 && .m.preemptoff != "" {
throw("notetsleep not on g0")
}
return notetsleep_internal(, )
}
func ( *note, int64) bool {
:= getg()
if == .m.g0 {
throw("notetsleepg on g0")
}
entersyscallblock()
:= notetsleep_internal(, )
exitsyscall()
return
}
func (int64, int64) (*g, bool) {
return nil, false
}
func () {}
func ( *m) {}
func ( int64) int32 {
:= getg().m
for := atomic.Xadd(&.waitsema, -1); ; = atomic.Load(&.waitsema) {
if int32() >= 0 {
return 0
}
futexsleep(&.waitsema, , )
if >= 0 {
if int32() >= 0 {
return 0
} else {
return -1
}
}
}
}
func ( *m) {
:= atomic.Xadd(&.waitsema, 1)
if == 0 {
futexwakeup(&.waitsema, 1)
}
}