Hello, I’m new to Go and coming from C, as such, I’m experimenting with -buildmode=c-shared, so far so good. Though, I ran into a problem where my C program exits after a function call because Go is internally calling os.Exit().
This terminate issue seems to happen when I try to cast a slice address to *C.char and return that as a C.struct member. This only happens on function return as the cast proceeds fine.
Here is my c-shared Go code:
package main
/*
typedef struct {
char *ptr;
int size;
} GoData;
*/
import (
"sync"
"unsafe"
)
var slice = make([]byte, 1024)
var cdata = C.GoData{}
//export GetData
func GetData() C.GoData {
cdata.size = 1024
cdata.ptr = (*C.char)(unsafe.Pointer(&slice[0])) // Error: causes program to terminate on C side with Exit(2)
//cdata.ptr = (*C.char)(C.malloc(C.sizeof_char * 1024)) // OK: seems to work fine
return cdata
}
func main() {
}
Here is a list of questions I have:
- Is there anyway to prove or debug the os.Exit() is being called on Go side? So far I’m putting a break point on C side on ExitProcess()
- Why can’t I share unsafe.Pointer(&slice[0]) directly with C code? (Isn’t the c-shared memory in same process address space?)
- I’m resorting to this behavior because I’d like Go code to allocate the large memory chunks of data via sync.pool and share it with C code - avoiding memory copies and C code doing free. Any recommendation here?
Thanks a bunch!