mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-11 14:57:36 +02:00
Trace object graph used to mark
This commit is contained in:
parent
c8d82f899f
commit
604eb682c5
2 changed files with 23 additions and 20 deletions
37
gc.c
37
gc.c
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Reference in a new issue