//go:nosplit
func semasleep(ns int64) int32 {
- _m_ := getg().m
+ mp := getg().m
if ns >= 0 {
- _m_.ts.tv_sec = ns / 1000000000
- _m_.ts.tv_nsec = ns % 1000000000
-
- _m_.libcall.fn = uintptr(unsafe.Pointer(&libc_sem_reltimedwait_np))
- _m_.libcall.n = 2
- _m_.scratch = mscratch{}
- _m_.scratch.v[0] = _m_.waitsema
- _m_.scratch.v[1] = uintptr(unsafe.Pointer(&_m_.ts))
- _m_.libcall.args = uintptr(unsafe.Pointer(&_m_.scratch))
- asmcgocall(unsafe.Pointer(&asmsysvicall6x), unsafe.Pointer(&_m_.libcall))
- if *_m_.perrno != 0 {
- if *_m_.perrno == _ETIMEDOUT || *_m_.perrno == _EAGAIN || *_m_.perrno == _EINTR {
+ mp.ts.tv_sec = ns / 1000000000
+ mp.ts.tv_nsec = ns % 1000000000
+
+ mp.libcall.fn = uintptr(unsafe.Pointer(&libc_sem_reltimedwait_np))
+ mp.libcall.n = 2
+ mp.scratch = mscratch{}
+ mp.scratch.v[0] = mp.waitsema
+ mp.scratch.v[1] = uintptr(unsafe.Pointer(&mp.ts))
+ mp.libcall.args = uintptr(unsafe.Pointer(&mp.scratch))
+ asmcgocall(unsafe.Pointer(&asmsysvicall6x), unsafe.Pointer(&mp.libcall))
+ if *mp.perrno != 0 {
+ if *mp.perrno == _ETIMEDOUT || *mp.perrno == _EAGAIN || *mp.perrno == _EINTR {
return -1
}
throw("sem_reltimedwait_np")
return 0
}
for {
- _m_.libcall.fn = uintptr(unsafe.Pointer(&libc_sem_wait))
- _m_.libcall.n = 1
- _m_.scratch = mscratch{}
- _m_.scratch.v[0] = _m_.waitsema
- _m_.libcall.args = uintptr(unsafe.Pointer(&_m_.scratch))
- asmcgocall(unsafe.Pointer(&asmsysvicall6x), unsafe.Pointer(&_m_.libcall))
- if _m_.libcall.r1 == 0 {
+ mp.libcall.fn = uintptr(unsafe.Pointer(&libc_sem_wait))
+ mp.libcall.n = 1
+ mp.scratch = mscratch{}
+ mp.scratch.v[0] = mp.waitsema
+ mp.libcall.args = uintptr(unsafe.Pointer(&mp.scratch))
+ asmcgocall(unsafe.Pointer(&asmsysvicall6x), unsafe.Pointer(&mp.libcall))
+ if mp.libcall.r1 == 0 {
break
}
- if *_m_.perrno == _EINTR {
+ if *mp.perrno == _EINTR {
continue
}
throw("sem_wait")
//go:nosplit
func semasleep(ns int64) int32 {
- _m_ := getg().m
+ mp := getg().m
if ns >= 0 {
var ts timespec
ts.tv_nsec -= 1e9
}
- if r, err := sem_timedwait((*semt)(unsafe.Pointer(_m_.waitsema)), &ts); r != 0 {
+ if r, err := sem_timedwait((*semt)(unsafe.Pointer(mp.waitsema)), &ts); r != 0 {
if err == _ETIMEDOUT || err == _EAGAIN || err == _EINTR {
return -1
}
- println("sem_timedwait err ", err, " ts.tv_sec ", ts.tv_sec, " ts.tv_nsec ", ts.tv_nsec, " ns ", ns, " id ", _m_.id)
+ println("sem_timedwait err ", err, " ts.tv_sec ", ts.tv_sec, " ts.tv_nsec ", ts.tv_nsec, " ns ", ns, " id ", mp.id)
throw("sem_timedwait")
}
return 0
}
for {
- r1, err := sem_wait((*semt)(unsafe.Pointer(_m_.waitsema)))
+ r1, err := sem_wait((*semt)(unsafe.Pointer(mp.waitsema)))
if r1 == 0 {
break
}
// Note also that g->m can change at preemption, so m can go stale
// if this function ever makes a function call.
_g_ := getg()
- _m_ := _g_.m
+ mp := _g_.m
// Is it okay for gp to panic instead of crashing the program?
// Yes, as long as it is running Go code, not runtime code,
// and not stuck in a system call.
- if gp == nil || gp != _m_.curg {
+ if gp == nil || gp != mp.curg {
return false
}
- if _m_.locks != 0 || _m_.mallocing != 0 || _m_.throwing != 0 || _m_.preemptoff != "" || _m_.dying != 0 {
+ if mp.locks != 0 || mp.mallocing != 0 || mp.throwing != 0 || mp.preemptoff != "" || mp.dying != 0 {
return false
}
status := readgstatus(gp)
if status&^_Gscan != _Grunning || gp.syscallsp != 0 {
return false
}
- if GOOS == "windows" && _m_.libcallsp != 0 {
+ if GOOS == "windows" && mp.libcallsp != 0 {
return false
}
return true