我从Go中调用以下C函数:
char *my_read(int dd) {
char *buf = malloc(sizeof(char) * BUF_SUZE);
if (!buf) {
return NULL; // cannot allocate memory
}
while (read(dd, buf, BUF_SIZE) < 0) {
if (errno == EAGAIN || errno == EINTR) {
continue;
}
break;
}
return buf;
}
我的Go代码如下所示:
//#include "hci_cgo.h"
import "C"
func MyRead(dd int) ([]byte, error) {
data, err := C.my_read(dd)
if err != nil {
return nil, err
}
if data == nil {
return nil, errors.New("my_read: cannot allocate memory")
}
// Here we create a Go slice of the data, but the C buffer is kept forever:
return C.GoBytes(unsafe.Pointer(data), C.BUF_SIZE)
}
在从MyRead
返回之前,如何修改MyRead
(或相应的C代码)以释放分配的缓冲区?
或者,我可以在C中重复使用单个缓冲区,从而完全避免分配,并在[]byte
返回后创建数据的Go C.my_read(…)
副本吗?如果是这样,我可以在MyRead
中放置一个互斥锁来确保对C.my_read(…)
的顺序调用,但是如何将C缓冲区复制到Go以便GC知道呢?