package runtime
import
type mOS struct {
initialized bool
mutex pthreadmutex
cond pthreadcond
count int
}
func ( string) {
println(, "not implemented")
*(*int)(unsafe.Pointer(uintptr(1231))) = 1231
}
func ( *m) {
if .initialized {
return
}
.initialized = true
if := pthread_mutex_init(&.mutex, nil); != 0 {
throw("pthread_mutex_init")
}
if := pthread_cond_init(&.cond, nil); != 0 {
throw("pthread_cond_init")
}
}
func ( int64) int32 {
var int64
if >= 0 {
= nanotime()
}
:= getg().m
pthread_mutex_lock(&.mutex)
for {
if .count > 0 {
.count--
pthread_mutex_unlock(&.mutex)
return 0
}
if >= 0 {
:= nanotime() -
if >= {
pthread_mutex_unlock(&.mutex)
return -1
}
var timespec
.setNsec( - )
:= pthread_cond_timedwait_relative_np(&.cond, &.mutex, &)
if == _ETIMEDOUT {
pthread_mutex_unlock(&.mutex)
return -1
}
} else {
pthread_cond_wait(&.cond, &.mutex)
}
}
}
func ( *m) {
pthread_mutex_lock(&.mutex)
.count++
if .count > 0 {
pthread_cond_signal(&.cond)
}
pthread_mutex_unlock(&.mutex)
}
var sigNoteRead, sigNoteWrite int32
func (*note) {
if sigNoteRead != 0 || sigNoteWrite != 0 {
throw("duplicate sigNoteSetup")
}
var int32
sigNoteRead, sigNoteWrite, = pipe()
if != 0 {
throw("pipe failed")
}
closeonexec(sigNoteRead)
closeonexec(sigNoteWrite)
setNonblock(sigNoteWrite)
}
func (*note) {
var byte
write(uintptr(sigNoteWrite), unsafe.Pointer(&), 1)
}
func (*note) {
entersyscallblock()
var byte
read(sigNoteRead, unsafe.Pointer(&), 1)
exitsyscall()
}
func () {
ncpu = getncpu()
physPageSize = getPageSize()
}
func ( []byte) (int32, int32) {
:= int32(0)
:= unsafe.Sizeof()
:= sysctlbyname(&[0], (*byte)(unsafe.Pointer(&)), &, nil, 0)
return ,
}
func ( []byte) (int32, int32) {
return sysctlbynameInt32()
}
const (
_CTL_HW = 6
_HW_NCPU = 3
_HW_PAGESIZE = 7
)
func () int32 {
:= [2]uint32{_CTL_HW, _HW_NCPU}
:= uint32(0)
:= unsafe.Sizeof()
:= sysctl(&[0], 2, (*byte)(unsafe.Pointer(&)), &, nil, 0)
if >= 0 && int32() > 0 {
return int32()
}
return 1
}
func () uintptr {
:= [2]uint32{_CTL_HW, _HW_PAGESIZE}
:= uint32(0)
:= unsafe.Sizeof()
:= sysctl(&[0], 2, (*byte)(unsafe.Pointer(&)), &, nil, 0)
if >= 0 && int32() > 0 {
return uintptr()
}
return 0
}
var urandom_dev = []byte("/dev/urandom\x00")
func ( []byte) {
:= open(&urandom_dev[0], 0 , 0)
:= read(, unsafe.Pointer(&[0]), int32(len()))
closefd()
extendRandom(, int())
}
func () {
goenvs_unix()
}
func ( *m) {
:= unsafe.Pointer(.g0.stack.hi)
if false {
print("newosproc stk=", , " m=", , " g=", .g0, " id=", .id, " ostk=", &, "\n")
}
var pthreadattr
var int32
= pthread_attr_init(&)
if != 0 {
write(2, unsafe.Pointer(&failthreadcreate[0]), int32(len(failthreadcreate)))
exit(1)
}
var uintptr
if pthread_attr_getstacksize(&, &) != 0 {
write(2, unsafe.Pointer(&failthreadcreate[0]), int32(len(failthreadcreate)))
exit(1)
}
.g0.stack.hi =
if pthread_attr_setdetachstate(&, _PTHREAD_CREATE_DETACHED) != 0 {
write(2, unsafe.Pointer(&failthreadcreate[0]), int32(len(failthreadcreate)))
exit(1)
}
var sigset
sigprocmask(_SIG_SETMASK, &sigset_all, &)
= pthread_create(&, funcPC(mstart_stub), unsafe.Pointer())
sigprocmask(_SIG_SETMASK, &, nil)
if != 0 {
write(2, unsafe.Pointer(&failthreadcreate[0]), int32(len(failthreadcreate)))
exit(1)
}
}
func ()
func ( uintptr, uintptr) {
var pthreadattr
var int32
= pthread_attr_init(&)
if != 0 {
write(2, unsafe.Pointer(&failthreadcreate[0]), int32(len(failthreadcreate)))
exit(1)
}
if pthread_attr_getstacksize(&, &) != 0 {
write(2, unsafe.Pointer(&failthreadcreate[0]), int32(len(failthreadcreate)))
exit(1)
}
g0.stack.hi =
memstats.stacks_sys.add(int64())
if pthread_attr_setdetachstate(&, _PTHREAD_CREATE_DETACHED) != 0 {
write(2, unsafe.Pointer(&failthreadcreate[0]), int32(len(failthreadcreate)))
exit(1)
}
var sigset
sigprocmask(_SIG_SETMASK, &sigset_all, &)
= pthread_create(&, , nil)
sigprocmask(_SIG_SETMASK, &, nil)
if != 0 {
write(2, unsafe.Pointer(&failthreadcreate[0]), int32(len(failthreadcreate)))
exit(1)
}
}
var failallocatestack = []byte("runtime: failed to allocate stack for the new OS thread\n")
var failthreadcreate = []byte("runtime: failed to create new OS thread\n")
func () {
initsig(true)
}
func ( *m) {
.gsignal = malg(32 * 1024)
.gsignal.m =
if GOOS == "darwin" && GOARCH == "arm64" {
mlock(unsafe.Pointer(.gsignal.stack.hi-physPageSize), physPageSize)
}
}
func () {
if !(GOOS == "ios" && GOARCH == "arm64") {
minitSignalStack()
}
minitSignalMask()
getg().m.procid = uint64(pthread_self())
}
func () {
if !(GOOS == "ios" && GOARCH == "arm64") {
unminitSignals()
}
}
func ( *m) {
}
func () {
usleep(1)
}
const (
_NSIG = 32
_SI_USER = 0
_SIG_BLOCK = 1
_SIG_UNBLOCK = 2
_SIG_SETMASK = 3
_SS_DISABLE = 4
)
type sigset uint32
var sigset_all = ^sigset(0)
func ( uint32, uintptr) {
var usigactiont
.sa_flags = _SA_SIGINFO | _SA_ONSTACK | _SA_RESTART
.sa_mask = ^uint32(0)
if == funcPC(sighandler) {
if iscgo {
= funcPC(cgoSigtramp)
} else {
= funcPC(sigtramp)
}
}
*(*uintptr)(unsafe.Pointer(&.__sigaction_u)) =
sigaction(, &, nil)
}
func ()
func ()
func ( uint32) {
var usigactiont
sigaction(, nil, &)
:= *(*uintptr)(unsafe.Pointer(&.__sigaction_u))
if .sa_flags&_SA_ONSTACK != 0 {
return
}
var usigactiont
*(*uintptr)(unsafe.Pointer(&.__sigaction_u)) =
.sa_mask = .sa_mask
.sa_flags = .sa_flags | _SA_ONSTACK
sigaction(, &, nil)
}
func ( uint32) uintptr {
var usigactiont
sigaction(, nil, &)
return *(*uintptr)(unsafe.Pointer(&.__sigaction_u))
}
func ( *stackt, uintptr) {
*(*uintptr)(unsafe.Pointer(&.ss_sp)) =
}
func ( *sigset, int) {
* |= 1 << (uint32() - 1)
}
func ( *sigset, int) {
* &^= 1 << (uint32() - 1)
}
var executablePath string
func ( int32, **byte) {
:= + 1
for argv_index(, ) != nil {
++
}
executablePath = gostringnocopy(argv_index(, +1))
const = "executable_path="
if len(executablePath) > len() && executablePath[:len()] == {
executablePath = executablePath[len():]
}
}
func ( *m, int) {
pthread_kill(pthread(.procid), uint32())
}