如何告诉cgo标记垃圾收集的[]字节?

时间:2014-11-17 23:37:05

标签: go garbage-collection cgo

我从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知道呢?

0 个答案:

没有答案