github.com/kidsbmilk/gofronted_all@v0.0.0-20220701224323-6479d5976c5d/libgo/misc/cgo/testsanitizers/testdata/tsan6.go (about) 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 }