Home | History | Annotate | Download | only in testdata
      1 // Copyright 2012 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 package race_test
      6 
      7 import (
      8 	"sync"
      9 	"testing"
     10 	"time"
     11 )
     12 
     13 func TestNoRaceMutex(t *testing.T) {
     14 	var mu sync.Mutex
     15 	var x int16 = 0
     16 	ch := make(chan bool, 2)
     17 	go func() {
     18 		mu.Lock()
     19 		defer mu.Unlock()
     20 		x = 1
     21 		ch <- true
     22 	}()
     23 	go func() {
     24 		mu.Lock()
     25 		x = 2
     26 		mu.Unlock()
     27 		ch <- true
     28 	}()
     29 	<-ch
     30 	<-ch
     31 }
     32 
     33 func TestRaceMutex(t *testing.T) {
     34 	var mu sync.Mutex
     35 	var x int16 = 0
     36 	ch := make(chan bool, 2)
     37 	go func() {
     38 		x = 1
     39 		mu.Lock()
     40 		defer mu.Unlock()
     41 		ch <- true
     42 	}()
     43 	go func() {
     44 		x = 2
     45 		mu.Lock()
     46 		mu.Unlock()
     47 		ch <- true
     48 	}()
     49 	<-ch
     50 	<-ch
     51 }
     52 
     53 func TestRaceMutex2(t *testing.T) {
     54 	var mu1 sync.Mutex
     55 	var mu2 sync.Mutex
     56 	var x int8 = 0
     57 	ch := make(chan bool, 2)
     58 	go func() {
     59 		mu1.Lock()
     60 		defer mu1.Unlock()
     61 		x = 1
     62 		ch <- true
     63 	}()
     64 	go func() {
     65 		mu2.Lock()
     66 		x = 2
     67 		mu2.Unlock()
     68 		ch <- true
     69 	}()
     70 	<-ch
     71 	<-ch
     72 }
     73 
     74 func TestNoRaceMutexPureHappensBefore(t *testing.T) {
     75 	var mu sync.Mutex
     76 	var x int16 = 0
     77 	ch := make(chan bool, 2)
     78 	go func() {
     79 		x = 1
     80 		mu.Lock()
     81 		mu.Unlock()
     82 		ch <- true
     83 	}()
     84 	go func() {
     85 		<-time.After(1e5)
     86 		mu.Lock()
     87 		mu.Unlock()
     88 		x = 1
     89 		ch <- true
     90 	}()
     91 	<-ch
     92 	<-ch
     93 }
     94 
     95 func TestNoRaceMutexSemaphore(t *testing.T) {
     96 	var mu sync.Mutex
     97 	ch := make(chan bool, 2)
     98 	x := 0
     99 	mu.Lock()
    100 	go func() {
    101 		x = 1
    102 		mu.Unlock()
    103 		ch <- true
    104 	}()
    105 	go func() {
    106 		mu.Lock()
    107 		x = 2
    108 		mu.Unlock()
    109 		ch <- true
    110 	}()
    111 	<-ch
    112 	<-ch
    113 }
    114 
    115 // from doc/go_mem.html
    116 func TestNoRaceMutexExampleFromHtml(t *testing.T) {
    117 	var l sync.Mutex
    118 	a := ""
    119 
    120 	l.Lock()
    121 	go func() {
    122 		a = "hello, world"
    123 		l.Unlock()
    124 	}()
    125 	l.Lock()
    126 	_ = a
    127 }
    128 
    129 func TestRaceMutexOverwrite(t *testing.T) {
    130 	c := make(chan bool, 1)
    131 	var mu sync.Mutex
    132 	go func() {
    133 		mu = sync.Mutex{}
    134 		c <- true
    135 	}()
    136 	mu.Lock()
    137 	<-c
    138 }
    139