diff options
Diffstat (limited to '')
-rw-r--r-- | misc/cgo/test/callback_c.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/misc/cgo/test/callback_c.c b/misc/cgo/test/callback_c.c new file mode 100644 index 0000000..8921b73 --- /dev/null +++ b/misc/cgo/test/callback_c.c @@ -0,0 +1,90 @@ +// 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)}); +} |