From: Christos Zoulas Date: Mon, 4 Dec 2017 23:50:19 +0000 (+0000) Subject: runtime: fix NetBSD CPU spin in lwp_park when CPU profiling is active X-Git-Tag: go1.10beta1~37 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=2ff2eab0d240ec4ccfbc05f17afa8d99c6fbed61;p=gostls13.git runtime: fix NetBSD CPU spin in lwp_park when CPU profiling is active Fixes #22981 Change-Id: I449eb7b5e022401e80a3ab138063e2f4499fbdf8 Reviewed-on: https://go-review.googlesource.com/81855 Reviewed-by: Brad Fitzpatrick Run-TryBot: Brad Fitzpatrick TryBot-Result: Gobot Gobot --- diff --git a/src/runtime/os_netbsd.go b/src/runtime/os_netbsd.go index b75ec7908b..3778969318 100644 --- a/src/runtime/os_netbsd.go +++ b/src/runtime/os_netbsd.go @@ -122,8 +122,8 @@ func semasleep(ns int64) int32 { // Compute sleep deadline. var tsp *timespec + var ts timespec if ns >= 0 { - var ts timespec var nsec int32 ts.set_sec(timediv(ns, 1000000000, &nsec)) ts.set_nsec(nsec) @@ -143,6 +143,15 @@ func semasleep(ns int64) int32 { ret := lwp_park(_CLOCK_MONOTONIC, _TIMER_RELTIME, tsp, 0, unsafe.Pointer(&_g_.m.waitsemacount), nil) if ret == _ETIMEDOUT { return -1 + } else if ret == _EINTR && ns >= 0 { + // Avoid sleeping forever if we keep getting + // interrupted (for example by the profiling + // timer). It would be if tsp upon return had the + // remaining time to sleep, but this is good enough. + var nsec int32 + ns /= 2 + ts.set_sec(timediv(ns, 1000000000, &nsec)) + ts.set_nsec(nsec) } } }