Функция Data_wrap_struct и mark - PullRequest
       28

Функция Data_wrap_struct и mark

8 голосов
/ 06 декабря 2011

Я пишу расширение для Ruby и использую функцию Data_wrap_struct.

Чтобы участвовать в процессе сбора мусора в Ruby, я должен определить подпрограмму для освобождения моей структуры и подпрограмму для пометки любых ссылок из моей структуры в другие структуры. Я передаю классическую функцию free, чтобы освободить память, но я не знаю, как использовать функцию метки.

мои структуры звучат так

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

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

Я думаю, что мне нужна функция пометки для пометки ссылок в collection структуры B.

Кто-то может показать мне пример того, как работает функция пометок?

1 Ответ

6 голосов
/ 24 февраля 2012

Функция mark используется для маркировки любых объектов Ruby , которыми владеет ваша структура C.

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);
}

Если объект, принадлежащий вашей структуре, не помечен, сборщик мусора можетразверните его, и ваш код может в конечном итоге попытаться использовать завершенный объект.

...