VM: simplify GC a bit, add GC_DEBUG compile-time flag

db4
Slava Pestov 2009-04-26 16:05:09 -05:00
parent dac5203e81
commit 087c962f75
4 changed files with 22 additions and 6 deletions

View File

@ -224,7 +224,8 @@ void mark_object_code_block(CELL scan)
{ {
case WORD_TYPE: case WORD_TYPE:
word = (F_WORD *)scan; word = (F_WORD *)scan;
mark_code_block(word->code); if(word->code)
mark_code_block(word->code);
if(word->profiling) if(word->profiling)
mark_code_block(word->profiling); mark_code_block(word->profiling);
break; break;

View File

@ -330,7 +330,7 @@ CELL copy_next_from_tenured(CELL scan)
void copy_reachable_objects(CELL scan, CELL *end) void copy_reachable_objects(CELL scan, CELL *end)
{ {
if(HAVE_NURSERY_P && collecting_gen == NURSERY) if(collecting_gen == NURSERY)
{ {
while(scan < *end) while(scan < *end)
scan = copy_next_from_nursery(scan); scan = copy_next_from_nursery(scan);
@ -405,7 +405,7 @@ void end_gc(CELL gc_elapsed)
if(collecting_gen != NURSERY) if(collecting_gen != NURSERY)
reset_generations(NURSERY,collecting_gen - 1); reset_generations(NURSERY,collecting_gen - 1);
} }
else if(HAVE_NURSERY_P && collecting_gen == NURSERY) else if(collecting_gen == NURSERY)
{ {
nursery.here = nursery.start; nursery.here = nursery.start;
} }

View File

@ -58,7 +58,7 @@ INLINE bool should_copy(CELL untagged)
return true; return true;
else if(HAVE_AGING_P && collecting_gen == AGING) else if(HAVE_AGING_P && collecting_gen == AGING)
return !in_zone(&data_heap->generations[TENURED],untagged); return !in_zone(&data_heap->generations[TENURED],untagged);
else if(HAVE_NURSERY_P && collecting_gen == NURSERY) else if(collecting_gen == NURSERY)
return in_zone(&nursery,untagged); return in_zone(&nursery,untagged);
else else
{ {
@ -78,15 +78,31 @@ allocation (which does not call GC because of possible roots in volatile
registers) does not run out of memory */ registers) does not run out of memory */
#define ALLOT_BUFFER_ZONE 1024 #define ALLOT_BUFFER_ZONE 1024
/* If this is defined, we GC every 100 allocations. This catches missing local roots */
#ifdef GC_DEBUG
static int count;
#endif
/* /*
* It is up to the caller to fill in the object's fields in a meaningful * It is up to the caller to fill in the object's fields in a meaningful
* fashion! * fashion!
*/ */
INLINE void *allot_object(CELL type, CELL a) INLINE void *allot_object(CELL type, CELL a)
{ {
#ifdef GC_DEBUG
if(!gc_off)
{
if(count++ % 1000 == 0)
gc();
}
#endif
CELL *object; CELL *object;
if(HAVE_NURSERY_P && nursery.size - ALLOT_BUFFER_ZONE > a) if(nursery.size - ALLOT_BUFFER_ZONE > a)
{ {
/* If there is insufficient room, collect the nursery */ /* If there is insufficient room, collect the nursery */
if(nursery.here + ALLOT_BUFFER_ZONE + a > nursery.end) if(nursery.here + ALLOT_BUFFER_ZONE + a > nursery.end)

View File

@ -37,7 +37,6 @@ F_DATA_HEAP *data_heap;
/* the 0th generation is where new objects are allocated. */ /* the 0th generation is where new objects are allocated. */
#define NURSERY 0 #define NURSERY 0
#define HAVE_NURSERY_P (data_heap->gen_count>1)
/* where objects hang around */ /* where objects hang around */
#define AGING (data_heap->gen_count-2) #define AGING (data_heap->gen_count-2)
#define HAVE_AGING_P (data_heap->gen_count>2) #define HAVE_AGING_P (data_heap->gen_count>2)