]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.16] testing/race: fixing intermittent test failure
authorDaniel S. Fava <danielsfava@gmail.com>
Fri, 12 Feb 2021 08:54:50 +0000 (09:54 +0100)
committerDmitri Shuralyov <dmitshur@golang.org>
Thu, 27 Jan 2022 16:35:59 +0000 (16:35 +0000)
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>
src/runtime/race/testdata/mutex_test.go

index cbed2d370caf3c032f1b39e636545dfc693c6db8..9dbed9a2c94352c3d22542afee9803eea9a40f31 100644 (file)
@@ -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