github.com/MangoDowner/go-gm@v0.0.0-20180818020936-8baa2bd4408c/misc/cgo/testsanitizers/tsan5.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 calls to C.malloc/C.free do not collide with the calls 8 // made by the os/user package. 9 10 // #cgo CFLAGS: -fsanitize=thread 11 // #cgo LDFLAGS: -fsanitize=thread 12 // #include <stdlib.h> 13 import "C" 14 15 import ( 16 "fmt" 17 "os" 18 "os/user" 19 "runtime" 20 "sync" 21 ) 22 23 func main() { 24 u, err := user.Current() 25 if err != nil { 26 fmt.Fprintln(os.Stderr, err) 27 // Let the test pass. 28 os.Exit(0) 29 } 30 31 var wg sync.WaitGroup 32 for i := 0; i < 20; i++ { 33 wg.Add(2) 34 go func() { 35 defer wg.Done() 36 for i := 0; i < 1000; i++ { 37 user.Lookup(u.Username) 38 runtime.Gosched() 39 } 40 }() 41 go func() { 42 defer wg.Done() 43 for i := 0; i < 1000; i++ { 44 p := C.malloc(C.size_t(len(u.Username) + 1)) 45 runtime.Gosched() 46 C.free(p) 47 } 48 }() 49 } 50 wg.Wait() 51 }