From: Aliaksandr Valialkin Date: Thu, 25 May 2017 22:14:30 +0000 (+0300) Subject: sync: deflake TestPool and TestPoolNew X-Git-Tag: go1.9rc1~135 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=3ea53cb08f1709b2f9bf39cfcfaa1d285256baa2;p=gostls13.git sync: deflake TestPool and TestPoolNew Prevent possible goroutine rescheduling to another P between Put and Get calls by locking the goroutine to OS thread. Inspired by the CL 42770. Fixes #20198. Change-Id: I18e24fcad1630658713e6b9d80d90d7941f604be Reviewed-on: https://go-review.googlesource.com/44310 Run-TryBot: Brad Fitzpatrick Reviewed-by: Ian Lance Taylor Reviewed-by: Austin Clements --- diff --git a/src/sync/export_test.go b/src/sync/export_test.go index 6ed38dad89..669076efad 100644 --- a/src/sync/export_test.go +++ b/src/sync/export_test.go @@ -7,3 +7,5 @@ package sync // Export for testing. var Runtime_Semacquire = runtime_Semacquire var Runtime_Semrelease = runtime_Semrelease +var Runtime_procPin = runtime_procPin +var Runtime_procUnpin = runtime_procUnpin diff --git a/src/sync/pool_test.go b/src/sync/pool_test.go index 5a38cbfcb6..9e5132bb18 100644 --- a/src/sync/pool_test.go +++ b/src/sync/pool_test.go @@ -23,6 +23,10 @@ func TestPool(t *testing.T) { if p.Get() != nil { t.Fatal("expected empty") } + + // Make sure that the goroutine doesn't migrate to another P + // between Put and Get calls. + Runtime_procPin() p.Put("a") p.Put("b") if g := p.Get(); g != "a" { @@ -34,6 +38,7 @@ func TestPool(t *testing.T) { if g := p.Get(); g != nil { t.Fatalf("got %#v; want nil", g) } + Runtime_procUnpin() p.Put("c") debug.SetGCPercent(100) // to allow following GC to actually run @@ -60,10 +65,16 @@ func TestPoolNew(t *testing.T) { if v := p.Get(); v != 2 { t.Fatalf("got %v; want 2", v) } + + // Make sure that the goroutine doesn't migrate to another P + // between Put and Get calls. + Runtime_procPin() p.Put(42) if v := p.Get(); v != 42 { t.Fatalf("got %v; want 42", v) } + Runtime_procUnpin() + if v := p.Get(); v != 3 { t.Fatalf("got %v; want 3", v) }