| // Copyright 2013 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 cgotest |
| |
| // extern void doAdd(int, int); |
| import "C" |
| |
| import ( |
| "runtime" |
| "sync" |
| "testing" |
| ) |
| |
| var sum struct { |
| sync.Mutex |
| i int |
| } |
| |
| //export Add |
| func Add(x int) { |
| defer func() { |
| recover() |
| }() |
| sum.Lock() |
| sum.i += x |
| sum.Unlock() |
| var p *int |
| *p = 2 |
| } |
| |
| func testCthread(t *testing.T) { |
| if runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") { |
| t.Skip("the iOS exec wrapper is unable to properly handle the panic from Add") |
| } |
| sum.i = 0 |
| C.doAdd(10, 6) |
| |
| want := 10 * (10 - 1) / 2 * 6 |
| if sum.i != want { |
| t.Fatalf("sum=%d, want %d", sum.i, want) |
| } |
| } |