Source File
os_darwin.go
Belonging Package
runtime
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)
func (*note) {
entersyscallblock()
var byte
read(sigNoteRead, unsafe.Pointer(&), 1)
exitsyscall()
}
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 ( []byte) {
:= open(&urandom_dev[0], 0 /* O_RDONLY */, 0)
:= read(, unsafe.Pointer(&[0]), int32(len()))
closefd()
extendRandom(, int())
}
func () {
goenvs_unix()
}
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 = // for mstart
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 ()
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 = // for mstart
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")
mlock(unsafe.Pointer(.gsignal.stack.hi-physPageSize), physPageSize)
}
}
if !(GOOS == "ios" && GOARCH == "arm64") {
minitSignalStack()
}
minitSignalMask()
getg().m.procid = uint64(pthread_self())
}
if !(GOOS == "ios" && GOARCH == "arm64") {
unminitSignals()
}
}
func ( *m) {
}
func () {
usleep(1)
}
const (
_NSIG = 32
_SI_USER = 0 /* empirically true, but not what headers say */
_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))
}
var executablePath string
:= + 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())
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |