2011-12-06 20 views
8

Bir Ruby uzantısı ve Im'i Data_wrap_struct işlevini kullanarak Im yazıyorum.Data_wrap_struct ve işaretleme işlevi

Ruby markalı çöp toplama işlemine katılabilmek için, yapmamı serbest bırakmak için bir yordam tanımlamanız ve yapıdan diğer yapılara yapılan tüm referansları işaretlemek için bir rutin tanımlamanız gerekir. Belleği boşaltmak için klasik free işlevini iletiyorum ancak bir işaret işlevinin nasıl kullanılacağını bilmiyorum.

benim yapılar Ben nasıl bir işareti işlevi görmeye

biri bana örnek gösterebilirler yapı B'nin collection başvuruları işaretlemek için bir işaret işlevini gerektiğini düşünüyorum bu

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

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

gibi ses Eserleri?

cevap

6

İşaretleme işlevi, C yapınızın sahip olduğu Ruby nesnelerini işaretlemek için kullanılır. Mikroyapınız ait nesne işaretli değilse

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

, çöp toplayıcı onu süpürüp olabilir ve kod kesinleşmiş nesneyi kullanmaya çalışıyor sona erebilir.

+1

Diğer Ruby nesneleri tarafından başvurulan Ruby olmayan nesneleri de işaretlemem gerekir mi? Benim durumumda diğer Ruby sınıfları tarafından yaratılmış bir widget ağacım var (onlara referansla). – lzap

+0

@ Izap, no. 'Mark' işlevi, Ruby'nin çöp toplayıcısına, bir C uzantısı gibi Ruby sanal makinesinin harici kodundan oluşturulan ** Ruby nesneleri hakkında bilgi vermek için kullanılır. Elinizde başka bir Ruby olmayan nesne yaratan bir Ruby nesnesi varsa, Ruby nesnesi çöp toplandıktan sonra kaynakları serbest bırakan bir 'serbest 'işlevini uygulamak isteyebilirsiniz. –