1efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen// Copyright 2011 The Go Authors. All rights reserved.
2efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen// Use of this source code is governed by a BSD-style
3efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen// license that can be found in the LICENSE file.
4efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen
5efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen#include <string.h>
6efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen#include <sys/types.h>
7efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen#include <unistd.h>
8efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen#include "_cgo_export.h"
9efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen
10efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsenvoid
11efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsencallback(void *f)
12efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen{
13efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen	// use some stack space
14efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen	volatile char data[64*1024];
15efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen
16efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen	data[0] = 0;
17efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen	goCallback(f);
18efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen        data[sizeof(data)-1] = 0;
19efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen}
20efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen
21efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsenvoid
22efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan WillemsencallGoFoo(void)
23efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen{
24efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen	extern void goFoo(void);
25efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen	goFoo();
26efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen}
27efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen
28efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsenvoid
29efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan WillemsenIntoC(void)
30efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen{
31efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen	BackIntoGo();
32efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen}
33efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen
34efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen#ifdef WIN32
35efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen#include <windows.h>
36efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsenlong long
37efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsenmysleep(int seconds) {
38efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen	long long st = GetTickCount();
39efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen	Sleep(1000 * seconds);
40efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen	return st;
41efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen}
42efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen#else
43efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen#include <sys/time.h>
44efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsenlong long
45efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsenmysleep(int seconds) {
46efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen	long long st;
47efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen	struct timeval tv;
48efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen	gettimeofday(&tv, NULL);
49efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen	st = tv.tv_sec * 1000 + tv.tv_usec / 1000;
50efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen	sleep(seconds);
51efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen	return st;
52efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen}
53efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen#endif
54efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen
55efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsenlong long
56efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan WillemsentwoSleep(int n)
57efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen{
58efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen	BackgroundSleep(n);
59efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen	return mysleep(n);
60efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen}
61efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen
62efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsenvoid
63efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan WillemsencallGoStackCheck(void)
64efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen{
65efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen	extern void goStackCheck(void);
66efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen	goStackCheck();
67efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen}
68efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen
69efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsenint
70efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan WillemsenreturnAfterGrow(void)
71efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen{
72efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen	extern int goReturnVal(void);
73efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen	goReturnVal();
74efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen	return 123456;
75efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen}
76efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen
77efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsenint
78efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan WillemsenreturnAfterGrowFromGo(void)
79efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen{
80efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen	extern int goReturnVal(void);
81efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen	return goReturnVal();
82efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen}
83efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen
84efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsenvoid
85efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan WillemsencallGoWithString(void)
86efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen{
87efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen	extern void goWithString(GoString);
88efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen	const char *str = "string passed from C to Go";
89efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen	goWithString((GoString){str, strlen(str)});
90efea46b87b2dcc66da02dfbf66fd901d24c7a09Dan Willemsen}
91