]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix NetBSD CPU spin in lwp_park when CPU profiling is active
authorChristos Zoulas <christos@zoulas.com>
Mon, 4 Dec 2017 23:50:19 +0000 (23:50 +0000)
committerBrad Fitzpatrick <bradfitz@golang.org>
Tue, 5 Dec 2017 00:08:51 +0000 (00:08 +0000)
Fixes #22981

Change-Id: I449eb7b5e022401e80a3ab138063e2f4499fbdf8
Reviewed-on: https://go-review.googlesource.com/81855
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/runtime/os_netbsd.go

index b75ec7908bd0bee504cb6dc06e8cddf70157dc5c..377896931814ace376ff82e714421085e2001c3d 100644 (file)
@@ -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)
                }
        }
 }