mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: make NetBSD lwp_park use monotonic time
This change updates runtime.semasleep to no longer call runtime.nanotime and instead calls lwp_park with a duration to sleep relative to the monotonic clock, so the nanotime is never called. (This requires updating to a newer version of the lwp_park system call, which is safe, because Go 1.10 will require the unreleased NetBSD 8+ anyway) Additionally, this change makes the nanotime function use the monotonic clock for netbsd/arm, which was forgotten from https://golang.org/cl/81135 which updated netbsd/amd64 and netbsd/386. Because semasleep previously depended on nanotime, the past few days of netbsd have likely been unstable because lwp_park was then mixing the monotonic and wall clocks. After this CL, lwp_park no longer depends on nanotime. Original patch submitted at: https://www.netbsd.org/~christos/go-lwp-park-clock-monotonic.diff This commit message (any any mistakes therein) were written by Brad Fitzpatrick. (Brad migrated the patch to Gerrit and checked CLAs) Updates #6007 Fixes #22968 Also updates netbsd/arm to use monotonic time for Change-Id: If77ef7dc610b3025831d84cdfadfbbba2c52acb2 Reviewed-on: https://go-review.googlesource.com/81715 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
871b79316a
commit
66fcf45477
4 changed files with 27 additions and 19 deletions
|
|
@ -58,7 +58,7 @@ func getcontext(ctxt unsafe.Pointer)
|
|||
func lwp_create(ctxt unsafe.Pointer, flags uintptr, lwpid unsafe.Pointer) int32
|
||||
|
||||
//go:noescape
|
||||
func lwp_park(abstime *timespec, unpark int32, hint, unparkhint unsafe.Pointer) int32
|
||||
func lwp_park(clockid, flags int32, ts *timespec, unpark int32, hint, unparkhint unsafe.Pointer) int32
|
||||
|
||||
//go:noescape
|
||||
func lwp_unpark(lwp int32, hint unsafe.Pointer) int32
|
||||
|
|
@ -76,6 +76,9 @@ const (
|
|||
_CLOCK_VIRTUAL = 1
|
||||
_CLOCK_PROF = 2
|
||||
_CLOCK_MONOTONIC = 3
|
||||
|
||||
_TIMER_RELTIME = 0
|
||||
_TIMER_ABSTIME = 1
|
||||
)
|
||||
|
||||
var sigset_all = sigset{[4]uint32{^uint32(0), ^uint32(0), ^uint32(0), ^uint32(0)}}
|
||||
|
|
@ -122,7 +125,6 @@ func semasleep(ns int64) int32 {
|
|||
if ns >= 0 {
|
||||
var ts timespec
|
||||
var nsec int32
|
||||
ns += nanotime()
|
||||
ts.set_sec(timediv(ns, 1000000000, &nsec))
|
||||
ts.set_nsec(nsec)
|
||||
tsp = &ts
|
||||
|
|
@ -138,7 +140,7 @@ func semasleep(ns int64) int32 {
|
|||
}
|
||||
|
||||
// Sleep until unparked by semawakeup or timeout.
|
||||
ret := lwp_park(tsp, 0, unsafe.Pointer(&_g_.m.waitsemacount), nil)
|
||||
ret := lwp_park(_CLOCK_MONOTONIC, _TIMER_RELTIME, tsp, 0, unsafe.Pointer(&_g_.m.waitsemacount), nil)
|
||||
if ret == _ETIMEDOUT {
|
||||
return -1
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue