| // Copyright 2011 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. |
| |
| #include <string.h> |
| #include <sys/types.h> |
| #include <unistd.h> |
| #include "_cgo_export.h" |
| |
| void |
| callback(void *f) |
| { |
| // use some stack space |
| volatile char data[64*1024]; |
| |
| data[0] = 0; |
| goCallback(f); |
| data[sizeof(data)-1] = 0; |
| } |
| |
| void |
| callGoFoo(void) |
| { |
| extern void goFoo(void); |
| goFoo(); |
| } |
| |
| void |
| IntoC(void) |
| { |
| BackIntoGo(); |
| } |
| |
| #ifdef WIN32 |
| #include <windows.h> |
| long long |
| mysleep(int seconds) { |
| long long st = GetTickCount(); |
| Sleep(1000 * seconds); |
| return st; |
| } |
| #else |
| #include <sys/time.h> |
| long long |
| mysleep(int seconds) { |
| long long st; |
| struct timeval tv; |
| gettimeofday(&tv, NULL); |
| st = tv.tv_sec * 1000 + tv.tv_usec / 1000; |
| sleep(seconds); |
| return st; |
| } |
| #endif |
| |
| long long |
| twoSleep(int n) |
| { |
| BackgroundSleep(n); |
| return mysleep(n); |
| } |
| |
| void |
| callGoStackCheck(void) |
| { |
| extern void goStackCheck(void); |
| goStackCheck(); |
| } |
| |
| int |
| returnAfterGrow(void) |
| { |
| extern int goReturnVal(void); |
| goReturnVal(); |
| return 123456; |
| } |
| |
| int |
| returnAfterGrowFromGo(void) |
| { |
| extern int goReturnVal(void); |
| return goReturnVal(); |
| } |
| |
| void |
| callGoWithString(void) |
| { |
| extern void goWithString(GoString); |
| const char *str = "string passed from C to Go"; |
| goWithString((GoString){str, strlen(str)}); |
| } |