| // 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)}); | |
| } |