"time"
)
-func TestNoRaceCond(t *testing.T) { // tsan's test02
- ch := make(chan bool, 1)
- var x int = 0
+func TestNoRaceCond(t *testing.T) {
+ x := 0
+ condition := 0
var mu sync.Mutex
- var cond *sync.Cond = sync.NewCond(&mu)
- var condition int = 0
- var waker func()
- waker = func() {
+ cond := sync.NewCond(&mu)
+ go func() {
x = 1
mu.Lock()
condition = 1
cond.Signal()
mu.Unlock()
+ }()
+ mu.Lock()
+ for condition != 1 {
+ cond.Wait()
}
-
- var waiter func()
- waiter = func() {
- go waker()
- cond.L.Lock()
- for condition != 1 {
- cond.Wait()
- }
- cond.L.Unlock()
- x = 2
- ch <- true
- }
- go waiter()
- <-ch
+ mu.Unlock()
+ x = 2
}
-func TestRaceCond(t *testing.T) { // tsan's test50
- ch := make(chan bool, 2)
-
- var x int = 0
+func TestRaceCond(t *testing.T) {
+ done := make(chan bool)
var mu sync.Mutex
- var condition int = 0
- var cond *sync.Cond = sync.NewCond(&mu)
-
- var waker func() = func() {
- <-time.After(1e5)
+ cond := sync.NewCond(&mu)
+ x := 0
+ condition := 0
+ go func() {
+ time.Sleep(10 * time.Millisecond) // Enter cond.Wait loop
x = 1
mu.Lock()
condition = 1
cond.Signal()
mu.Unlock()
- <-time.After(1e5)
+ time.Sleep(10 * time.Millisecond) // Exit cond.Wait loop
mu.Lock()
x = 3
mu.Unlock()
- ch <- true
- }
-
- var waiter func() = func() {
- mu.Lock()
- for condition != 1 {
- cond.Wait()
- }
- mu.Unlock()
- x = 2
- ch <- true
+ done <- true
+ }()
+ mu.Lock()
+ for condition != 1 {
+ cond.Wait()
}
- x = 0
- go waker()
- go waiter()
- <-ch
- <-ch
+ mu.Unlock()
+ x = 2
+ <-done
}
// We do not currently automatically