1
0
mirror of https://github.com/golang/go synced 2024-09-25 11:20:13 -06:00

runtime: deflake TestNumGoroutine

Fixes #14107.

Change-Id: Icd9463b1a77b139c7ebc2d8732482d704ea332d0
Reviewed-on: https://go-review.googlesource.com/19002
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
Russ Cox 2016-01-27 16:21:33 -05:00
parent 3a21f0a9c1
commit a3c1a3f401

View File

@ -345,12 +345,27 @@ func TestNumGoroutine(t *testing.T) {
}
buf := make([]byte, 1<<20)
buf = buf[:runtime.Stack(buf, true)]
n := runtime.NumGoroutine()
// Try up to 10 times for a match before giving up.
// This is a fundamentally racy check but it's important
// to notice if NumGoroutine and Stack are _always_ out of sync.
for i := 0; ; i++ {
// Give goroutines about to exit a chance to exit.
// The NumGoroutine and Stack below need to see
// the same state of the world, so anything we can do
// to keep it quiet is good.
runtime.Gosched()
if nstk := strings.Count(string(buf), "goroutine "); n != nstk {
t.Fatalf("NumGoroutine=%d, but found %d goroutines in stack dump: %s", n, nstk, buf)
n := runtime.NumGoroutine()
buf = buf[:runtime.Stack(buf, true)]
nstk := strings.Count(string(buf), "goroutine ")
if n == nstk {
break
}
if i >= 10 {
t.Fatalf("NumGoroutine=%d, but found %d goroutines in stack dump: %s", n, nstk, buf)
}
}
}