2011-12-06 14 views
8

Estoy escribiendo una extensión de Ruby y estoy usando la función Data_wrap_struct.Data_wrap_struct y marca la función

Para participar en el proceso de recolección de elementos no utilizados de Ruby, necesito definir una rutina para liberar mi estructura, y una rutina para marcar cualquier referencia de mi estructura a otras estructuras. Paso la función clásica free para liberar la memoria, pero no sé cómo usar una función de marca.

mis estructuras suenan como esto

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

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

Creo que necesito una función de marca para marcar las referencias en collection de estructura B.

Alguien me puede mostrar un ejemplo para ver cómo una función de marca ¿trabajos?

Respuesta

6

La función de marca se utiliza para marcar cualquier objeto Ruby que posea su estructura en 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); 
} 

Si el objeto propiedad de su estructura no está marcado, el recolector de basura podría barrer y su código puede terminar tratando de utilizar un objeto finalizado.

+1

¿Debo marcar también objetos que no son de Ruby a los que hacen referencia otros objetos de Ruby? En mi caso, tengo un árbol de widgets creado por otras clases de Ruby (con referencias a ellos). – lzap

+0

@Izap, no. La función 'mark' se usa para informar al recolector de basura de Ruby sobre ** objetos Ruby ** que se crearon a partir de un código externo a la máquina virtual Ruby, como una extensión C. Si tiene en sus manos un objeto Ruby que crea otros objetos nativos que no son Ruby, puede implementar una función 'free' que libera recursos una vez que el objeto Ruby es recolectado. –

Cuestiones relacionadas