|  | // Copyright 2016 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 main | 
|  |  | 
|  | // The stubs for the C functions read and write the same slot on the | 
|  | // g0 stack when copying arguments in and out. | 
|  |  | 
|  | /* | 
|  | #cgo CFLAGS: -fsanitize=thread | 
|  | #cgo LDFLAGS: -fsanitize=thread | 
|  |  | 
|  | int Func1() { | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | void Func2(int x) { | 
|  | (void)x; | 
|  | } | 
|  | */ | 
|  | import "C" | 
|  |  | 
|  | func main() { | 
|  | const N = 10000 | 
|  | done := make(chan bool, N) | 
|  | for i := 0; i < N; i++ { | 
|  | go func() { | 
|  | C.Func1() | 
|  | done <- true | 
|  | }() | 
|  | go func() { | 
|  | C.Func2(0) | 
|  | done <- true | 
|  | }() | 
|  | } | 
|  | for i := 0; i < 2*N; i++ { | 
|  | <-done | 
|  | } | 
|  | } |