Commit 2ff2eab0 authored by Christos Zoulas's avatar Christos Zoulas Committed by Brad Fitzpatrick

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/81855Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 9d70b3ae
...@@ -122,8 +122,8 @@ func semasleep(ns int64) int32 { ...@@ -122,8 +122,8 @@ func semasleep(ns int64) int32 {
// Compute sleep deadline. // Compute sleep deadline.
var tsp *timespec var tsp *timespec
var ts timespec
if ns >= 0 { if ns >= 0 {
var ts timespec
var nsec int32 var nsec int32
ts.set_sec(timediv(ns, 1000000000, &nsec)) ts.set_sec(timediv(ns, 1000000000, &nsec))
ts.set_nsec(nsec) ts.set_nsec(nsec)
...@@ -143,6 +143,15 @@ func semasleep(ns int64) int32 { ...@@ -143,6 +143,15 @@ func semasleep(ns int64) int32 {
ret := lwp_park(_CLOCK_MONOTONIC, _TIMER_RELTIME, 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 { if ret == _ETIMEDOUT {
return -1 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)
} }
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment