diff options
Diffstat (limited to 'libgo/go')
-rw-r--r-- | libgo/go/runtime/os_aix.go | 4 | ||||
-rw-r--r-- | libgo/go/runtime/os_gccgo.go | 3 | ||||
-rw-r--r-- | libgo/go/runtime/os_hurd.go | 4 | ||||
-rw-r--r-- | libgo/go/runtime/os_linux.go | 4 | ||||
-rw-r--r-- | libgo/go/runtime/os_netbsd.go | 17 | ||||
-rw-r--r-- | libgo/go/runtime/os_solaris.go | 4 |
6 files changed, 29 insertions, 7 deletions
diff --git a/libgo/go/runtime/os_aix.go b/libgo/go/runtime/os_aix.go index 951aeb6..f49b83c 100644 --- a/libgo/go/runtime/os_aix.go +++ b/libgo/go/runtime/os_aix.go @@ -21,6 +21,10 @@ type mOS struct { waitsema uintptr // semaphore for parking on locks } +func getProcID() uint64 { + return uint64(gettid()) +} + //extern malloc func libc_malloc(uintptr) unsafe.Pointer diff --git a/libgo/go/runtime/os_gccgo.go b/libgo/go/runtime/os_gccgo.go index ab19022..a8859c0 100644 --- a/libgo/go/runtime/os_gccgo.go +++ b/libgo/go/runtime/os_gccgo.go @@ -27,8 +27,7 @@ func mpreinit(mp *m) { func minit() { minitSignals() - // FIXME: only works on linux for now. - getg().m.procid = uint64(gettid()) + getg().m.procid = getProcID() } // Called from dropm to undo the effect of an minit. diff --git a/libgo/go/runtime/os_hurd.go b/libgo/go/runtime/os_hurd.go index b3c6f80..1613b41 100644 --- a/libgo/go/runtime/os_hurd.go +++ b/libgo/go/runtime/os_hurd.go @@ -18,6 +18,10 @@ type mOS struct { waitsema uintptr // semaphore for parking on locks } +func getProcID() uint64 { + return uint64(gettid()) +} + //extern malloc func libc_malloc(uintptr) unsafe.Pointer diff --git a/libgo/go/runtime/os_linux.go b/libgo/go/runtime/os_linux.go index 5d55064..627b6d6 100644 --- a/libgo/go/runtime/os_linux.go +++ b/libgo/go/runtime/os_linux.go @@ -13,6 +13,10 @@ type mOS struct { unused byte } +func getProcID() uint64 { + return uint64(gettid()) +} + func futex(addr unsafe.Pointer, op int32, val uint32, ts, addr2 unsafe.Pointer, val3 uint32) int32 { return int32(syscall(_SYS_futex, uintptr(addr), uintptr(op), uintptr(val), uintptr(ts), uintptr(addr2), uintptr(val3))) } diff --git a/libgo/go/runtime/os_netbsd.go b/libgo/go/runtime/os_netbsd.go index 69d2c71..89a8d07 100644 --- a/libgo/go/runtime/os_netbsd.go +++ b/libgo/go/runtime/os_netbsd.go @@ -14,12 +14,19 @@ type mOS struct { waitsemacount uint32 } +func getProcID() uint64 { + return uint64(lwp_self()) +} + +//extern _lwp_self +func lwp_self() int32 + //go:noescape -//extern lwp_park +//extern _lwp_park func lwp_park(ts int32, rel int32, abstime *timespec, unpark int32, hint, unparkhint unsafe.Pointer) int32 //go:noescape -//extern lwp_unpark +//extern _lwp_unpark func lwp_unpark(lwp int32, hint unsafe.Pointer) int32 //go:noescape @@ -88,7 +95,7 @@ func semasleep(ns int64) int32 { tsp = &ts } ret := lwp_park(_CLOCK_MONOTONIC, _TIMER_RELTIME, tsp, 0, unsafe.Pointer(&_g_.m.waitsemacount), nil) - if ret == _ETIMEDOUT { + if ret != 0 && errno() == _ETIMEDOUT { return -1 } } @@ -101,10 +108,10 @@ func semawakeup(mp *m) { // "If the target LWP is not currently waiting, it will return // immediately upon the next call to _lwp_park()." ret := lwp_unpark(int32(mp.procid), unsafe.Pointer(&mp.waitsemacount)) - if ret != 0 && ret != _ESRCH { + if ret != 0 && errno() != _ESRCH { // semawakeup can be called on signal stack. systemstack(func() { - print("thrwakeup addr=", &mp.waitsemacount, " sem=", mp.waitsemacount, " ret=", ret, "\n") + print("thrwakeup addr=", &mp.waitsemacount, " sem=", mp.waitsemacount, " errno=", errno(), "\n") }) } } diff --git a/libgo/go/runtime/os_solaris.go b/libgo/go/runtime/os_solaris.go index 63b5cd7..c568629 100644 --- a/libgo/go/runtime/os_solaris.go +++ b/libgo/go/runtime/os_solaris.go @@ -10,6 +10,10 @@ type mOS struct { waitsema uintptr // semaphore for parking on locks } +func getProcID() uint64 { + return uint64(gettid()) +} + //extern malloc func libc_malloc(uintptr) unsafe.Pointer |