mirror of
https://github.com/golang/go
synced 2024-11-23 14:50:07 -07:00
1b6807bb06
During a cgo call, the stack can be copied. This copy invalidates the pointer that cgo has into the return value area. To fix this problem, pass the address of the location containing the stack top value (which is in the G struct). For cgo functions which return values, read the stktop before and after the cgo call to compute the adjustment necessary to write the return value. Fixes #8771 LGTM=iant, rsc R=iant, rsc, khr CC=golang-codereviews https://golang.org/cl/144130043
83 lines
1.1 KiB
C
83 lines
1.1 KiB
C
// 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 <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(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();
|
|
}
|
|
|