]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix preemption deadlocks in TestDebugCall*
authorAustin Clements <austin@google.com>
Wed, 23 May 2018 18:01:21 +0000 (14:01 -0400)
committerAustin Clements <austin@google.com>
Thu, 24 May 2018 15:39:56 +0000 (15:39 +0000)
TestDebugCall* uses atomic spin loops and hence can deadlock if the
garbage collector is enabled (because of #10958; ironically,
implementing debugger call injection is closely related to fixing this
exact issue, but we're not there yet).

Fix this by disabling the garbage collector during these tests.

Updates #25519 (might fix it, though I suspect not)

Change-Id: If1e454b9cdea8e4b1cd82509b762c75b6acd8476
Reviewed-on: https://go-review.googlesource.com/114086
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
src/runtime/debug_test.go

index bbc86fba9e564527a22a4bf0a75fc6af7507e8bb..4181d59c1f1673a66a3cdfca46ec1869e758fd24 100644 (file)
@@ -18,14 +18,17 @@ package runtime_test
 import (
        "fmt"
        "runtime"
+       "runtime/debug"
        "sync/atomic"
        "syscall"
        "testing"
 )
 
 func startDebugCallWorker(t *testing.T) (g *runtime.G, after func()) {
-       // This can deadlock if there aren't enough threads.
+       // This can deadlock if there aren't enough threads or if a GC
+       // tries to interrupt an atomic loop (see issue #10958).
        ogomaxprocs := runtime.GOMAXPROCS(2)
+       ogcpercent := debug.SetGCPercent(-1)
 
        ready := make(chan *runtime.G)
        var stop uint32
@@ -39,6 +42,7 @@ func startDebugCallWorker(t *testing.T) (g *runtime.G, after func()) {
                        t.Fatal(err)
                }
                runtime.GOMAXPROCS(ogomaxprocs)
+               debug.SetGCPercent(ogcpercent)
        }
 }
 
@@ -156,8 +160,10 @@ func debugCallUnsafePointWorker(gpp **runtime.G, ready, stop *uint32) {
 }
 
 func TestDebugCallUnsafePoint(t *testing.T) {
-       // This can deadlock if there aren't enough threads.
+       // This can deadlock if there aren't enough threads or if a GC
+       // tries to interrupt an atomic loop (see issue #10958).
        defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(2))
+       defer debug.SetGCPercent(debug.SetGCPercent(-1))
 
        // Test that the runtime refuses call injection at unsafe points.
        var g *runtime.G