1// Copyright 2013 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
5package cgotest
6
7// extern void doAdd(int, int);
8import "C"
9
10import (
11	"runtime"
12	"sync"
13	"testing"
14)
15
16var sum struct {
17	sync.Mutex
18	i int
19}
20
21//export Add
22func Add(x int) {
23	defer func() {
24		recover()
25	}()
26	sum.Lock()
27	sum.i += x
28	sum.Unlock()
29	var p *int
30	*p = 2
31}
32
33func testCthread(t *testing.T) {
34	if runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") {
35		t.Skip("the iOS exec wrapper is unable to properly handle the panic from Add")
36	}
37	sum.i = 0
38	C.doAdd(10, 6)
39
40	want := 10 * (10 - 1) / 2 * 6
41	if sum.i != want {
42		t.Fatalf("sum=%d, want %d", sum.i, want)
43	}
44}
45