Trace object graph used to mark

This commit is contained in:
Justin Ethier 2015-11-26 01:52:42 -05:00
parent c8d82f899f
commit 604eb682c5
2 changed files with 23 additions and 20 deletions

37
gc.c
View file

@ -808,10 +808,12 @@ void gc_mut_update(gc_thread_data *thd, object old_obj, object value)
//Cyc_display(old_obj, stdout); //Cyc_display(old_obj, stdout);
//printf("\n"); //printf("\n");
gc_mark_gray(thd, old_obj); gc_mark_gray(thd, old_obj);
printf("added to mark buffer (trace) from write barrier %p:", old_obj); if (is_object_type(old_obj)) {
printf("added to mark buffer (trace) from write barrier %p:mark %d:", old_obj, mark(old_obj));
Cyc_display(old_obj, stdout); Cyc_display(old_obj, stdout);
printf("\n"); printf("\n");
} }
}
// TODO: concerned there may be an issue here with a stack object // TODO: concerned there may be an issue here with a stack object
// having a 'tree' of references that contains heap objects. these // having a 'tree' of references that contains heap objects. these
// objects would be skipped and would never be grayed by the current // objects would be skipped and would never be grayed by the current
@ -952,37 +954,37 @@ void gc_mark_black(object obj)
// for cons and vector types, as these pointers could change. // for cons and vector types, as these pointers could change.
switch(type_of(obj)) { switch(type_of(obj)) {
case cons_tag: { case cons_tag: {
gc_collector_mark_gray(car(obj)); gc_collector_mark_gray(obj, car(obj));
gc_collector_mark_gray(cdr(obj)); gc_collector_mark_gray(obj, cdr(obj));
break; break;
} }
case closure1_tag: case closure1_tag:
gc_collector_mark_gray(((closure1) obj)->elt1); gc_collector_mark_gray(obj, ((closure1) obj)->elt1);
break; break;
case closure2_tag: case closure2_tag:
gc_collector_mark_gray(((closure2) obj)->elt1); gc_collector_mark_gray(obj, ((closure2) obj)->elt1);
gc_collector_mark_gray(((closure2) obj)->elt2); gc_collector_mark_gray(obj, ((closure2) obj)->elt2);
case closure3_tag: case closure3_tag:
gc_collector_mark_gray(((closure3) obj)->elt1); gc_collector_mark_gray(obj, ((closure3) obj)->elt1);
gc_collector_mark_gray(((closure3) obj)->elt2); gc_collector_mark_gray(obj, ((closure3) obj)->elt2);
gc_collector_mark_gray(((closure3) obj)->elt3); gc_collector_mark_gray(obj, ((closure3) obj)->elt3);
case closure4_tag: case closure4_tag:
gc_collector_mark_gray(((closure4) obj)->elt1); gc_collector_mark_gray(obj, ((closure4) obj)->elt1);
gc_collector_mark_gray(((closure4) obj)->elt2); gc_collector_mark_gray(obj, ((closure4) obj)->elt2);
gc_collector_mark_gray(((closure4) obj)->elt3); gc_collector_mark_gray(obj, ((closure4) obj)->elt3);
gc_collector_mark_gray(((closure4) obj)->elt4); gc_collector_mark_gray(obj, ((closure4) obj)->elt4);
break; break;
case closureN_tag: { case closureN_tag: {
int i, n = ((closureN) obj)->num_elt; int i, n = ((closureN) obj)->num_elt;
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
gc_collector_mark_gray(((closureN) obj)->elts[i]); gc_collector_mark_gray(obj, ((closureN) obj)->elts[i]);
} }
break; break;
} }
case vector_tag: { case vector_tag: {
int i, n = ((vector) obj)->num_elt; int i, n = ((vector) obj)->num_elt;
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
gc_collector_mark_gray(((vector) obj)->elts[i]); gc_collector_mark_gray(obj, ((vector) obj)->elts[i]);
} }
break; break;
} }
@ -990,7 +992,7 @@ void gc_mark_black(object obj)
cvar_type *c = (cvar_type *)obj; cvar_type *c = (cvar_type *)obj;
object pvar = *(c->pvar); object pvar = *(c->pvar);
if (pvar) { if (pvar) {
gc_collector_mark_gray(pvar); gc_collector_mark_gray(obj, pvar);
} }
break; break;
} }
@ -1005,7 +1007,7 @@ void gc_mark_black(object obj)
} }
} }
void gc_collector_mark_gray(object obj) void gc_collector_mark_gray(object parent, object obj)
{ {
// "Color" objects gray by adding them to the mark stack for further processing. // "Color" objects gray by adding them to the mark stack for further processing.
// //
@ -1014,6 +1016,7 @@ void gc_collector_mark_gray(object obj)
// could lead to stack corruption. // could lead to stack corruption.
if (is_object_type(obj) && mark(obj) == gc_color_clear) { if (is_object_type(obj) && mark(obj) == gc_color_clear) {
mark_stack = vpbuffer_add(mark_stack, &mark_stack_len, mark_stack_i++, obj); mark_stack = vpbuffer_add(mark_stack, &mark_stack_len, mark_stack_i++, obj);
printf("mark gray parent = %p obj = %p\n", parent, obj);
} }
} }

View file

@ -165,7 +165,7 @@ void gc_stack_mark_gray(gc_thread_data *thd, object obj);
void gc_mark_gray(gc_thread_data *thd, object obj); void gc_mark_gray(gc_thread_data *thd, object obj);
void gc_collector_trace(); void gc_collector_trace();
void gc_mark_black(object obj); void gc_mark_black(object obj);
void gc_collector_mark_gray(object obj); void gc_collector_mark_gray(object parent, object obj);
void gc_empty_collector_stack(); void gc_empty_collector_stack();
void gc_handshake(gc_status_type s); void gc_handshake(gc_status_type s);
void gc_post_handshake(gc_status_type s); void gc_post_handshake(gc_status_type s);