Data_wrap_struct和标记功能

时间:2011-12-06 11:07:05

标签: c ruby ruby-c-extension

我正在使用函数Data_wrap_struct编写Ruby扩展和Im。

为了参与Ruby的标记和清除垃圾收集过程,我需要定义一个例程来释放我的结构,以及一个例程来标记从我的结构到其他结构的任何引用。我传递了经典的free函数来释放内存,但我不知道如何使用标记函数。

我的结构听起来像这样

typedef struct
{
  int x;
  int y;
} A;

typedef struct
{
  A collection[10];
  int current;
} B;

我认为我需要一个标记函数来标记结构B的collection中的引用。

有人可以给我看一个示例,看看标记功能是如何工作的吗?

1 个答案:

答案 0 :(得分:6)

mark函数用于标记C结构所拥有的任何 Ruby对象

typedef struct {
    VALUE ruby_object;
} MyStruct;

void mark(void * p) {
    /* p is the wrapped pointer to the MyStruct instance */
    MyStruct * my_struct = (MyStruct *) p;
    rb_gc_mark(my_struct->ruby_object);
}

如果您的结构所拥有的对象未标记,则垃圾收集器可以扫描它,您的代码可能最终尝试使用已完成的对象。