diff options
Diffstat (limited to 'src/pkg/runtime/race/testdata/chan_test.go')
| -rw-r--r-- | src/pkg/runtime/race/testdata/chan_test.go | 65 |
1 files changed, 64 insertions, 1 deletions
diff --git a/src/pkg/runtime/race/testdata/chan_test.go b/src/pkg/runtime/race/testdata/chan_test.go index d6a1f14db1..aab59a553d 100644 --- a/src/pkg/runtime/race/testdata/chan_test.go +++ b/src/pkg/runtime/race/testdata/chan_test.go @@ -568,12 +568,14 @@ func TestRaceChanCloseLen(t *testing.T) { } func TestRaceChanSameCell(t *testing.T) { - c := make(chan int, 1) + c := make(chan int, 2) v := 0 go func() { v = 1 c <- 42 <-c + c <- 42 + <-c }() time.Sleep(1e7) c <- 43 @@ -591,3 +593,64 @@ func TestRaceChanCloseSend(t *testing.T) { c <- 0 <-compl } + +func TestNoRaceChanMutex(t *testing.T) { + done := make(chan struct{}) + mtx := make(chan struct{}, 1) + data := 0 + go func() { + mtx <- struct{}{} + data = 42 + <-mtx + done <- struct{}{} + }() + mtx <- struct{}{} + data = 43 + <-mtx + <-done +} + +func TestNoRaceSelectMutex(t *testing.T) { + done := make(chan struct{}) + mtx := make(chan struct{}, 1) + aux := make(chan bool) + data := 0 + go func() { + select { + case mtx <- struct{}{}: + case <-aux: + } + data = 42 + select { + case <-mtx: + case <-aux: + } + done <- struct{}{} + }() + select { + case mtx <- struct{}{}: + case <-aux: + } + data = 43 + select { + case <-mtx: + case <-aux: + } + <-done +} + +func TestRaceChanSem(t *testing.T) { + done := make(chan struct{}) + mtx := make(chan struct{}, 2) + data := 0 + go func() { + mtx <- struct{}{} + data = 42 + <-mtx + done <- struct{}{} + }() + mtx <- struct{}{} + data = 43 + <-mtx + <-done +} |
