aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel S. Fava <danielsfava@gmail.com>2021-02-12 09:54:50 +0100
committerDmitri Shuralyov <dmitshur@golang.org>2022-01-27 16:35:59 +0000
commit6cbcf581aff555d09d91ae1b3b360511ebb7e35f (patch)
treefc9206e972c694cb868870786a3c35bf031fd635
parent57d5d8f98748d0c3f47d44898acaa019c548ffc1 (diff)
downloadgo-6cbcf581aff555d09d91ae1b3b360511ebb7e35f.tar.gz
go-6cbcf581aff555d09d91ae1b3b360511ebb7e35f.zip
[release-branch.go1.16] testing/race: fixing intermittent test failure
Test NoRaceMutexPureHappensBefore in runtime/race/testdata/mutex_test.go expects the second spawned goroutine to run after the first. The test attempts to force this scheduling with a 10 millisecond wait. Following a suggestion by Bryan Mills, we force this scheduling using a shared variable whose access take place within the existing mutex. Fixes #50832. Updates #35745. Change-Id: Ib23ec51492ecfeed4752e020401dd25755a669ed Reviewed-on: https://go-review.googlesource.com/c/go/+/291292 Reviewed-by: Bryan C. Mills <bcmills@google.com> Reviewed-by: Dmitry Vyukov <dvyukov@google.com> Trust: Bryan C. Mills <bcmills@google.com> Run-TryBot: Bryan C. Mills <bcmills@google.com> TryBot-Result: Go Bot <gobot@golang.org> (cherry picked from commit aaed6cbced238030053df4e54f676a1d59df89d7) Reviewed-on: https://go-review.googlesource.com/c/go/+/381034 Trust: Bryan Mills <bcmills@google.com> Run-TryBot: Bryan Mills <bcmills@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
-rw-r--r--src/runtime/race/testdata/mutex_test.go9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/runtime/race/testdata/mutex_test.go b/src/runtime/race/testdata/mutex_test.go
index cbed2d370c..9dbed9a2c9 100644
--- a/src/runtime/race/testdata/mutex_test.go
+++ b/src/runtime/race/testdata/mutex_test.go
@@ -78,16 +78,23 @@ func TestNoRaceMutexPureHappensBefore(t *testing.T) {
var mu sync.Mutex
var x int16 = 0
_ = x
+ written := false
ch := make(chan bool, 2)
go func() {
x = 1
mu.Lock()
+ written = true
mu.Unlock()
ch <- true
}()
go func() {
- <-time.After(1e5)
+ time.Sleep(100 * time.Microsecond)
mu.Lock()
+ for !written {
+ mu.Unlock()
+ time.Sleep(100 * time.Microsecond)
+ mu.Lock()
+ }
mu.Unlock()
x = 1
ch <- true