Refactor gc_mut_update and handle TRACE case

This commit is contained in:
Justin Ethier 2016-02-29 23:02:30 -05:00
parent 98a18a225a
commit 76b5cbce00

34
gc.c
View file

@ -741,6 +741,22 @@ int gc_is_stack_obj(gc_thread_data *thd, object obj)
check_overflow(obj, high_limit)); check_overflow(obj, high_limit));
} }
/**
* Helper function for gc_mut_update
*/
static void mark_stack_or_heap_obj(gc_thread_data *thd, object obj)
{
if (gc_is_stack_obj(thd, obj)) {
// Set object to be marked after moved to heap by next GC.
// This avoids having to recursively examine the stack now,
// which we have to do anyway during minor GC.
grayed(obj) = 1;
} else {
// Value is on the heap, mark gray right now
gc_mark_gray(thd, obj);
}
}
/** /**
* Write barrier for updates to heap-allocated objects * Write barrier for updates to heap-allocated objects
* The key for this barrier is to identify stack objects that contain * The key for this barrier is to identify stack objects that contain
@ -752,27 +768,15 @@ void gc_mut_update(gc_thread_data *thd, object old_obj, object value)
stage = ck_pr_load_int(&gc_stage); stage = ck_pr_load_int(&gc_stage);
if (ck_pr_load_int(&(thd->gc_status)) != STATUS_ASYNC) { if (ck_pr_load_int(&(thd->gc_status)) != STATUS_ASYNC) {
pthread_mutex_lock(&(thd->lock)); pthread_mutex_lock(&(thd->lock));
if (gc_is_stack_obj(thd, old_obj)) { mark_stack_or_heap_obj(thd, old_obj);
grayed(old_obj) = 1; mark_stack_or_heap_obj(thd, value);
} else {
gc_mark_gray(thd, old_obj);
}
if (gc_is_stack_obj(thd, value)) {
// Set object to be marked after moved to heap by next GC.
// This avoids having to recursively examine the stack now,
// which we have to do anyway during minor GC.
grayed(value) = 1;
} else {
// Value is on the heap, mark gray right now
gc_mark_gray(thd, value);
}
pthread_mutex_unlock(&(thd->lock)); pthread_mutex_unlock(&(thd->lock));
} else if (stage == STAGE_TRACING) { } else if (stage == STAGE_TRACING) {
//fprintf(stderr, "DEBUG - GC async tracing marking heap obj %p ", old_obj); //fprintf(stderr, "DEBUG - GC async tracing marking heap obj %p ", old_obj);
//Cyc_display(old_obj, stderr); //Cyc_display(old_obj, stderr);
//fprintf(stderr, "\n"); //fprintf(stderr, "\n");
pthread_mutex_lock(&(thd->lock)); pthread_mutex_lock(&(thd->lock));
gc_mark_gray(thd, old_obj); mark_stack_or_heap_obj(thd, old_obj);
pthread_mutex_unlock(&(thd->lock)); pthread_mutex_unlock(&(thd->lock));
#if GC_DEBUG_VERBOSE #if GC_DEBUG_VERBOSE
if (is_object_type(old_obj) && mark(old_obj) == gc_color_clear) { if (is_object_type(old_obj) && mark(old_obj) == gc_color_clear) {