diff options
author | Tianon Gravi <admwiggin@gmail.com> | 2015-01-15 11:54:00 -0700 |
---|---|---|
committer | Tianon Gravi <admwiggin@gmail.com> | 2015-01-15 11:54:00 -0700 |
commit | f154da9e12608589e8d5f0508f908a0c3e88a1bb (patch) | |
tree | f8255d51e10c6f1e0ed69702200b966c9556a431 /src/pkg/runtime/race/testdata/chan_test.go | |
parent | 8d8329ed5dfb9622c82a9fbec6fd99a580f9c9f6 (diff) | |
download | golang-f154da9e12608589e8d5f0508f908a0c3e88a1bb.tar.gz |
Imported Upstream version 1.4upstream/1.4
Diffstat (limited to 'src/pkg/runtime/race/testdata/chan_test.go')
-rw-r--r-- | src/pkg/runtime/race/testdata/chan_test.go | 659 |
1 files changed, 0 insertions, 659 deletions
diff --git a/src/pkg/runtime/race/testdata/chan_test.go b/src/pkg/runtime/race/testdata/chan_test.go deleted file mode 100644 index 4a3d5290f..000000000 --- a/src/pkg/runtime/race/testdata/chan_test.go +++ /dev/null @@ -1,659 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package race_test - -import ( - "runtime" - "testing" - "time" -) - -func TestNoRaceChanSync(t *testing.T) { - v := 0 - c := make(chan int) - go func() { - v = 1 - c <- 0 - }() - <-c - v = 2 -} - -func TestNoRaceChanSyncRev(t *testing.T) { - v := 0 - c := make(chan int) - go func() { - c <- 0 - v = 2 - }() - v = 1 - <-c -} - -func TestNoRaceChanAsync(t *testing.T) { - v := 0 - c := make(chan int, 10) - go func() { - v = 1 - c <- 0 - }() - <-c - v = 2 -} - -func TestRaceChanAsyncRev(t *testing.T) { - v := 0 - c := make(chan int, 10) - go func() { - c <- 0 - v = 1 - }() - v = 2 - <-c -} - -func TestNoRaceChanAsyncCloseRecv(t *testing.T) { - v := 0 - c := make(chan int, 10) - go func() { - v = 1 - close(c) - }() - func() { - defer func() { - recover() - v = 2 - }() - <-c - }() -} - -func TestNoRaceChanAsyncCloseRecv2(t *testing.T) { - v := 0 - c := make(chan int, 10) - go func() { - v = 1 - close(c) - }() - _, _ = <-c - v = 2 -} - -func TestNoRaceChanAsyncCloseRecv3(t *testing.T) { - v := 0 - c := make(chan int, 10) - go func() { - v = 1 - close(c) - }() - for _ = range c { - } - v = 2 -} - -func TestNoRaceChanSyncCloseRecv(t *testing.T) { - v := 0 - c := make(chan int) - go func() { - v = 1 - close(c) - }() - func() { - defer func() { - recover() - v = 2 - }() - <-c - }() -} - -func TestNoRaceChanSyncCloseRecv2(t *testing.T) { - v := 0 - c := make(chan int) - go func() { - v = 1 - close(c) - }() - _, _ = <-c - v = 2 -} - -func TestNoRaceChanSyncCloseRecv3(t *testing.T) { - v := 0 - c := make(chan int) - go func() { - v = 1 - close(c) - }() - for _ = range c { - } - v = 2 -} - -func TestRaceChanSyncCloseSend(t *testing.T) { - v := 0 - c := make(chan int) - go func() { - v = 1 - close(c) - }() - func() { - defer func() { - recover() - }() - c <- 0 - }() - v = 2 -} - -func TestRaceChanAsyncCloseSend(t *testing.T) { - v := 0 - c := make(chan int, 10) - go func() { - v = 1 - close(c) - }() - func() { - defer func() { - recover() - }() - for { - c <- 0 - } - }() - v = 2 -} - -func TestRaceChanCloseClose(t *testing.T) { - compl := make(chan bool, 2) - v1 := 0 - v2 := 0 - c := make(chan int) - go func() { - defer func() { - if recover() != nil { - v2 = 2 - } - compl <- true - }() - v1 = 1 - close(c) - }() - go func() { - defer func() { - if recover() != nil { - v1 = 2 - } - compl <- true - }() - v2 = 1 - close(c) - }() - <-compl - <-compl -} - -func TestRaceChanSendLen(t *testing.T) { - v := 0 - c := make(chan int, 10) - go func() { - v = 1 - c <- 1 - }() - for len(c) == 0 { - runtime.Gosched() - } - v = 2 -} - -func TestRaceChanRecvLen(t *testing.T) { - v := 0 - c := make(chan int, 10) - c <- 1 - go func() { - v = 1 - <-c - }() - for len(c) != 0 { - runtime.Gosched() - } - v = 2 -} - -func TestRaceChanSendSend(t *testing.T) { - compl := make(chan bool, 2) - v1 := 0 - v2 := 0 - c := make(chan int, 1) - go func() { - v1 = 1 - select { - case c <- 1: - default: - v2 = 2 - } - compl <- true - }() - go func() { - v2 = 1 - select { - case c <- 1: - default: - v1 = 2 - } - compl <- true - }() - <-compl - <-compl -} - -func TestNoRaceChanPtr(t *testing.T) { - type msg struct { - x int - } - c := make(chan *msg) - go func() { - c <- &msg{1} - }() - m := <-c - m.x = 2 -} - -func TestRaceChanWrongSend(t *testing.T) { - v1 := 0 - v2 := 0 - c := make(chan int, 2) - go func() { - v1 = 1 - c <- 1 - }() - go func() { - v2 = 2 - c <- 2 - }() - time.Sleep(1e7) - if <-c == 1 { - v2 = 3 - } else { - v1 = 3 - } -} - -func TestRaceChanWrongClose(t *testing.T) { - v1 := 0 - v2 := 0 - c := make(chan int, 1) - go func() { - defer func() { - recover() - }() - v1 = 1 - c <- 1 - }() - go func() { - time.Sleep(1e7) - v2 = 2 - close(c) - }() - time.Sleep(2e7) - if _, who := <-c; who { - v2 = 2 - } else { - v1 = 2 - } -} - -func TestRaceChanSendClose(t *testing.T) { - compl := make(chan bool, 2) - c := make(chan int, 1) - go func() { - defer func() { - recover() - compl <- true - }() - c <- 1 - }() - go func() { - time.Sleep(10 * time.Millisecond) - close(c) - compl <- true - }() - <-compl - <-compl -} - -func TestRaceChanSendSelectClose(t *testing.T) { - compl := make(chan bool, 2) - c := make(chan int, 1) - c1 := make(chan int) - go func() { - defer func() { - recover() - compl <- true - }() - time.Sleep(10 * time.Millisecond) - select { - case c <- 1: - case <-c1: - } - }() - go func() { - close(c) - compl <- true - }() - <-compl - <-compl -} - -func TestRaceSelectReadWriteAsync(t *testing.T) { - done := make(chan bool) - x := 0 - c1 := make(chan int, 10) - c2 := make(chan int, 10) - c3 := make(chan int) - c2 <- 1 - go func() { - select { - case c1 <- x: // read of x races with... - case c3 <- 1: - } - done <- true - }() - select { - case x = <-c2: // ... write to x here - case c3 <- 1: - } - <-done -} - -func TestRaceSelectReadWriteSync(t *testing.T) { - done := make(chan bool) - x := 0 - c1 := make(chan int) - c2 := make(chan int) - c3 := make(chan int) - // make c1 and c2 ready for communication - go func() { - <-c1 - }() - go func() { - c2 <- 1 - }() - go func() { - select { - case c1 <- x: // read of x races with... - case c3 <- 1: - } - done <- true - }() - select { - case x = <-c2: // ... write to x here - case c3 <- 1: - } - <-done -} - -func TestNoRaceSelectReadWriteAsync(t *testing.T) { - done := make(chan bool) - x := 0 - c1 := make(chan int) - c2 := make(chan int) - go func() { - select { - case c1 <- x: // read of x does not race with... - case c2 <- 1: - } - done <- true - }() - select { - case x = <-c1: // ... write to x here - case c2 <- 1: - } - <-done -} - -func TestRaceChanReadWriteAsync(t *testing.T) { - done := make(chan bool) - c1 := make(chan int, 10) - c2 := make(chan int, 10) - c2 <- 10 - x := 0 - go func() { - c1 <- x // read of x races with... - done <- true - }() - x = <-c2 // ... write to x here - <-done -} - -func TestRaceChanReadWriteSync(t *testing.T) { - done := make(chan bool) - c1 := make(chan int) - c2 := make(chan int) - // make c1 and c2 ready for communication - go func() { - <-c1 - }() - go func() { - c2 <- 10 - }() - x := 0 - go func() { - c1 <- x // read of x races with... - done <- true - }() - x = <-c2 // ... write to x here - <-done -} - -func TestNoRaceChanReadWriteAsync(t *testing.T) { - done := make(chan bool) - c1 := make(chan int, 10) - x := 0 - go func() { - c1 <- x // read of x does not race with... - done <- true - }() - x = <-c1 // ... write to x here - <-done -} - -func TestNoRaceProducerConsumerUnbuffered(t *testing.T) { - type Task struct { - f func() - done chan bool - } - - queue := make(chan Task) - - go func() { - t := <-queue - t.f() - t.done <- true - }() - - doit := func(f func()) { - done := make(chan bool, 1) - queue <- Task{f, done} - <-done - } - - x := 0 - doit(func() { - x = 1 - }) - _ = x -} - -func TestRaceChanItselfSend(t *testing.T) { - compl := make(chan bool, 1) - c := make(chan int, 10) - go func() { - c <- 0 - compl <- true - }() - c = make(chan int, 20) - <-compl -} - -func TestRaceChanItselfRecv(t *testing.T) { - compl := make(chan bool, 1) - c := make(chan int, 10) - c <- 1 - go func() { - <-c - compl <- true - }() - time.Sleep(1e7) - c = make(chan int, 20) - <-compl -} - -func TestRaceChanItselfNil(t *testing.T) { - c := make(chan int, 10) - go func() { - c <- 0 - }() - time.Sleep(1e7) - c = nil - _ = c -} - -func TestRaceChanItselfClose(t *testing.T) { - compl := make(chan bool, 1) - c := make(chan int) - go func() { - close(c) - compl <- true - }() - c = make(chan int) - <-compl -} - -func TestRaceChanItselfLen(t *testing.T) { - compl := make(chan bool, 1) - c := make(chan int) - go func() { - _ = len(c) - compl <- true - }() - c = make(chan int) - <-compl -} - -func TestRaceChanItselfCap(t *testing.T) { - compl := make(chan bool, 1) - c := make(chan int) - go func() { - _ = cap(c) - compl <- true - }() - c = make(chan int) - <-compl -} - -func TestRaceChanCloseLen(t *testing.T) { - v := 0 - c := make(chan int, 10) - c <- 0 - go func() { - v = 1 - close(c) - }() - time.Sleep(1e7) - _ = len(c) - v = 2 -} - -func TestRaceChanCloseSend(t *testing.T) { - compl := make(chan bool, 1) - c := make(chan int, 10) - go func() { - close(c) - compl <- true - }() - 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 bool, 2) - data := 0 - go func() { - mtx <- true - data = 42 - <-mtx - done <- struct{}{} - }() - mtx <- true - data = 43 - <-mtx - <-done -} - -func TestNoRaceChanWaitGroup(t *testing.T) { - const N = 10 - chanWg := make(chan bool, N/2) - data := make([]int, N) - for i := 0; i < N; i++ { - chanWg <- true - go func(i int) { - data[i] = 42 - <-chanWg - }(i) - } - for i := 0; i < cap(chanWg); i++ { - chanWg <- true - } - for i := 0; i < N; i++ { - _ = data[i] - } -} |