Ruby Garbage Collection: пометить неэкспортированные переменные - PullRequest
2 голосов
/ 05 апреля 2009

У меня есть несколько структур, связанных с Data_Wrap_Struct для объектов ruby, и я также предоставил функции mark () и free ().

Когда я вручную запускаю ГХ или просто жду, пока он прыгнет, мои рубиновые объекты будут убиты. Пока ничего нового.

Странная вещь: когда я пытаюсь защитить эти объекты с помощью rb_gc_register_address (), ничего не происходит - мои объекты все равно будут убиты.

Я могу помешать GC делать это только так:

objects = rb_ary_new();
rb_gc_register_address(&objects);
rb_ary_push(objects, data);

Это единственный способ и почему я не могу просто использовать rb_gc_register_address ()?

1 Ответ

1 голос
/ 07 апреля 2009

Взглянув на это, кажется, что все типы выстраиваются в ряд (вы возвращаете VALUE и передаете ptr VALUE), поэтому я предполагаю, что операция mark неправильно маркирует объекты, а фаза подметания захватывает их вверх.

Возможно, помещая дочерние объекты в массив с правильной функцией маркера, вы защищаете свои объекты данных.

Это скорее теория, чем твердый ответ, но, возможно, с этого стоит начать. :)

Нет, по иронии судьбы, вернемся к копанию слишком глубоко в Ruby GC. Смотря вау некоторые рекрутеры. : D

- Правка -

Чтобы добавить к этому, я просто копался в gc.c и в строке 1098 точный тест, который вы хотите fail -

if (! (P-> as.basic.flags & FL_MARK))

Так что сделайте то, что вы должны в своей функции отметки, чтобы включить в свои флаги FL_MARK, чтобы уборщик не ... хм ... вас не охватил.

...