]> Cypherpunks.ru repositories - gostls13.git/blob - misc/cgo/testsanitizers/testdata/tsan6.go
runtime: remove crash_cgo_test CgoRaceSignal timeout
[gostls13.git] / misc / cgo / testsanitizers / testdata / tsan6.go
1 // Copyright 2016 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 main
6
7 // Check that writes to Go allocated memory, with Go synchronization,
8 // do not look like a race.
9
10 /*
11 #cgo CFLAGS: -fsanitize=thread
12 #cgo LDFLAGS: -fsanitize=thread
13
14 void f(char *p) {
15         *p = 1;
16 }
17 */
18 import "C"
19
20 import (
21         "runtime"
22         "sync"
23 )
24
25 func main() {
26         var wg sync.WaitGroup
27         var mu sync.Mutex
28         c := make(chan []C.char, 100)
29         for i := 0; i < 10; i++ {
30                 wg.Add(2)
31                 go func() {
32                         defer wg.Done()
33                         for i := 0; i < 100; i++ {
34                                 c <- make([]C.char, 4096)
35                                 runtime.Gosched()
36                         }
37                 }()
38                 go func() {
39                         defer wg.Done()
40                         for i := 0; i < 100; i++ {
41                                 p := &(<-c)[0]
42                                 mu.Lock()
43                                 C.f(p)
44                                 mu.Unlock()
45                         }
46                 }()
47         }
48         wg.Wait()
49 }