// 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 | |
import ( | |
"fmt" | |
"os" | |
"sync" | |
"unsafe" | |
"./a" | |
) | |
func F1() int { | |
var buf [1024]int | |
a.F1(uintptr(unsafe.Pointer(&buf[0]))) | |
return buf[0] | |
} | |
func F2() int { | |
var buf [1024]int | |
a.F2(uintptr(unsafe.Pointer(&buf[0]))) | |
return buf[0] | |
} | |
var t = a.GetT() | |
func M1() int { | |
var buf [1024]int | |
t.M1(uintptr(unsafe.Pointer(&buf[0]))) | |
return buf[0] | |
} | |
func M2() int { | |
var buf [1024]int | |
t.M2(uintptr(unsafe.Pointer(&buf[0]))) | |
return buf[0] | |
} | |
func main() { | |
// Use different goroutines to force stack growth. | |
var wg sync.WaitGroup | |
wg.Add(4) | |
c := make(chan bool, 4) | |
go func() { | |
defer wg.Done() | |
b := F1() | |
if b != 42 { | |
fmt.Printf("F1: got %d, expected 42\n", b) | |
c <- false | |
} | |
}() | |
go func() { | |
defer wg.Done() | |
b := F2() | |
if b != 42 { | |
fmt.Printf("F2: got %d, expected 42\n", b) | |
c <- false | |
} | |
}() | |
go func() { | |
defer wg.Done() | |
b := M1() | |
if b != 42 { | |
fmt.Printf("M1: got %d, expected 42\n", b) | |
c <- false | |
} | |
}() | |
go func() { | |
defer wg.Done() | |
b := M2() | |
if b != 42 { | |
fmt.Printf("M2: got %d, expected 42\n", b) | |
c <- false | |
} | |
}() | |
wg.Wait() | |
select { | |
case <-c: | |
os.Exit(1) | |
default: | |
} | |
} |