diff options
Diffstat (limited to 'libgo/go/runtime/os_dragonfly.go')
-rw-r--r-- | libgo/go/runtime/os_dragonfly.go | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/libgo/go/runtime/os_dragonfly.go b/libgo/go/runtime/os_dragonfly.go index abcad72..d214f7f 100644 --- a/libgo/go/runtime/os_dragonfly.go +++ b/libgo/go/runtime/os_dragonfly.go @@ -19,6 +19,32 @@ func sys_umtx_sleep(addr *uint32, val, timeout int32) int32 //extern umtx_wakeup func sys_umtx_wakeup(addr *uint32, val int32) int32 +//go:noescape +//extern sysctl +func sysctl(*uint32, uint32, *byte, *uintptr, *byte, uintptr) int32 + +func getncpu() int32 { + mib := [2]uint32{_CTL_HW, _HW_NCPU} + out := uint32(0) + nout := uintptr(unsafe.Sizeof(out)) + ret := sysctl(&mib[0], 2, (*byte)(unsafe.Pointer(&out)), &nout, nil, 0) + if ret >= 0 { + return int32(out) + } + return 1 +} + +func getPageSize() uintptr { + mib := [2]uint32{_CTL_HW, _HW_PAGESIZE} + out := uint32(0) + nout := uintptr(unsafe.Sizeof(out)) + ret := sysctl(&mib[0], 2, (*byte)(unsafe.Pointer(&out)), &nout, nil, 0) + if ret >= 0 { + return uintptr(out) + } + return 0 +} + //go:nosplit func futexsleep(addr *uint32, val uint32, ns int64) { systemstack(func() { @@ -61,3 +87,10 @@ func futexwakeup(addr *uint32, cnt uint32) { *(*int32)(unsafe.Pointer(uintptr(0x1006))) = 0x1006 }) } + +func osinit() { + ncpu = getncpu() + if physPageSize == 0 { + physPageSize = getPageSize() + } +} |