aboutsummaryrefslogtreecommitdiff
path: root/src/sync
diff options
context:
space:
mode:
authorAliaksandr Valialkin <valyala@gmail.com>2017-05-26 01:14:30 +0300
committerBrad Fitzpatrick <bradfitz@golang.org>2017-06-28 22:02:07 +0000
commit3ea53cb08f1709b2f9bf39cfcfaa1d285256baa2 (patch)
tree83f64dcfb5ec12f889ce6f37642dd9b20d0c5e82 /src/sync
parent0f61ae7e17cb13ad530b6c6708157d7b8dc0aa8f (diff)
downloadgo-3ea53cb08f1709b2f9bf39cfcfaa1d285256baa2.tar.xz
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 <bradfitz@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org> Reviewed-by: Austin Clements <austin@google.com>
Diffstat (limited to 'src/sync')
-rw-r--r--src/sync/export_test.go2
-rw-r--r--src/sync/pool_test.go11
2 files changed, 13 insertions, 0 deletions
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)
}