mirror of https://github.com/golang/go.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 <bradfitz@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org> Reviewed-by: Austin Clements <austin@google.com>
This commit is contained in:
parent
0f61ae7e17
commit
3ea53cb08f
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue