Moved gc_full to NewGC struct

svn: r12265
This commit is contained in:
Kevin Tew 2008-11-05 21:05:55 +00:00
parent 79bac843cb
commit 5a76a7b3bb
2 changed files with 19 additions and 19 deletions

View File

@ -295,7 +295,6 @@ static struct mpage *pages[PAGE_TYPES];
/* miscellaneous variables */ /* miscellaneous variables */
static const char *zero_sized[4]; /* all 0-sized allocs get this */ static const char *zero_sized[4]; /* all 0-sized allocs get this */
static int gc_full = 0; /* a flag saying if this is a full/major collection */
static Mark_Proc mark_table[NUMBER_OF_TAGS]; /* the table of mark procs */ static Mark_Proc mark_table[NUMBER_OF_TAGS]; /* the table of mark procs */
static Fixup_Proc fixup_table[NUMBER_OF_TAGS]; /* the table of repair procs */ static Fixup_Proc fixup_table[NUMBER_OF_TAGS]; /* the table of repair procs */
static unsigned long memory_in_use = 0; /* the amount of memory in use */ static unsigned long memory_in_use = 0; /* the amount of memory in use */
@ -1959,7 +1958,7 @@ static void prepare_pages_for_collection(void)
int i; int i;
GCDEBUG((DEBUGOUTF, "PREPPING PAGES.\n")); GCDEBUG((DEBUGOUTF, "PREPPING PAGES.\n"));
if(gc_full) { if(GC->gc_full) {
/* we need to make sure that previous_size for every page is reset, so /* we need to make sure that previous_size for every page is reset, so
we don't accidentally screw up the mark routine */ we don't accidentally screw up the mark routine */
if (GC->generations_available) { if (GC->generations_available) {
@ -1998,7 +1997,7 @@ static void prepare_pages_for_collection(void)
static void mark_backpointers(void) static void mark_backpointers(void)
{ {
if(!gc_full) { if(!GC->gc_full) {
struct mpage *work; struct mpage *work;
int i; int i;
@ -2295,7 +2294,7 @@ static void clean_up_heap(void)
for(i = 0; i < PAGE_TYPES; i++) { for(i = 0; i < PAGE_TYPES; i++) {
struct mpage *prev = NULL; struct mpage *prev = NULL;
if(gc_full) { if(GC->gc_full) {
work = pages[i]; work = pages[i];
while(work) { while(work) {
if(!work->marked_on) { if(!work->marked_on) {
@ -2359,7 +2358,7 @@ static void protect_old_pages(void)
#if 0 #if 0
extern double scheme_get_inexact_milliseconds(void); extern double scheme_get_inexact_milliseconds(void);
# define TIME_DECLS() double start, task_start # define TIME_DECLS() double start, task_start
# define TIME_INIT() start = task_start = scheme_get_inexact_milliseconds(); fprintf(stderr, "GC (%d):\n", gc_full) # define TIME_INIT() start = task_start = scheme_get_inexact_milliseconds(); fprintf(stderr, "GC (%d):\n", GC->gc_full)
# define TIME_STEP(task) fprintf(stderr, " %s: %lf\n", task, scheme_get_inexact_milliseconds() - task_start); \ # define TIME_STEP(task) fprintf(stderr, " %s: %lf\n", task, scheme_get_inexact_milliseconds() - task_start); \
task_start = scheme_get_inexact_milliseconds() task_start = scheme_get_inexact_milliseconds()
# define TIME_DONE() fprintf(stderr, " Total: %lf\n", scheme_get_inexact_milliseconds() - start) # define TIME_DONE() fprintf(stderr, " Total: %lf\n", scheme_get_inexact_milliseconds() - start)
@ -2388,20 +2387,20 @@ static void garbage_collect(int force_full)
NewGC *gc = GC; NewGC *gc = GC;
/* determine if this should be a full collection or not */ /* determine if this should be a full collection or not */
gc_full = force_full || !gc->generations_available gc->gc_full = force_full || !gc->generations_available
|| (since_last_full > 100) || (memory_in_use > (2 * last_full_mem_use)); || (since_last_full > 100) || (memory_in_use > (2 * last_full_mem_use));
#if 0 #if 0
printf("Collection %li (full = %i): %i / %i / %i / %i %ld\n", number, printf("Collection %li (full = %i): %i / %i / %i / %i %ld\n", number,
gc_full, force_full, !generations_available, gc->gc_full, force_full, !generations_available,
(since_last_full > 100), (memory_in_use > (2 * last_full_mem_use)), (since_last_full > 100), (memory_in_use > (2 * last_full_mem_use)),
last_full_mem_use); last_full_mem_use);
#endif #endif
next_gc_full = gc_full; next_gc_full = gc->gc_full;
if (gc->full_needed_for_finalization) { if (gc->full_needed_for_finalization) {
gc->full_needed_for_finalization= 0; gc->full_needed_for_finalization= 0;
gc_full = 1; gc->gc_full = 1;
} }
number++; number++;
@ -2450,10 +2449,10 @@ static void garbage_collect(int force_full)
propagate_marks(); mark_ready_ephemerons(); propagate_marks(); propagate_marks(); mark_ready_ephemerons(); propagate_marks();
check_finalizers(1); mark_ready_ephemerons(); propagate_marks(); check_finalizers(1); mark_ready_ephemerons(); propagate_marks();
check_finalizers(2); mark_ready_ephemerons(); propagate_marks(); check_finalizers(2); mark_ready_ephemerons(); propagate_marks();
if(gc_full) zero_weak_finalizers(); if(gc->gc_full) zero_weak_finalizers();
do_ordered_level3(); propagate_marks(); do_ordered_level3(); propagate_marks();
check_finalizers(3); propagate_marks(); check_finalizers(3); propagate_marks();
if(gc_full) { if(gc->gc_full) {
reset_weak_finalizers(); reset_weak_finalizers();
propagate_marks(); propagate_marks();
} }
@ -2474,7 +2473,7 @@ static void garbage_collect(int force_full)
TIME_STEP("zeroed"); TIME_STEP("zeroed");
if(gc_full) do_heap_compact(); if(gc->gc_full) do_heap_compact();
TIME_STEP("compacted"); TIME_STEP("compacted");
@ -2497,13 +2496,13 @@ static void garbage_collect(int force_full)
TIME_STEP("cleaned heap"); TIME_STEP("cleaned heap");
reset_nursery(); reset_nursery();
TIME_STEP("reset nursurey"); TIME_STEP("reset nursurey");
if (gc_full) if (gc->gc_full)
do_btc_accounting(); do_btc_accounting();
TIME_STEP("accounted"); TIME_STEP("accounted");
if (gc->generations_available) if (gc->generations_available)
protect_old_pages(); protect_old_pages();
TIME_STEP("protect"); TIME_STEP("protect");
if (gc_full) if (gc->gc_full)
flush_freed_pages(); flush_freed_pages();
reset_finalizer_tree(); reset_finalizer_tree();
@ -2520,9 +2519,9 @@ static void garbage_collect(int force_full)
} }
/* update some statistics */ /* update some statistics */
if(gc_full) gc->num_major_collects++; else gc->num_minor_collects++; if(gc->gc_full) gc->num_major_collects++; else gc->num_minor_collects++;
if(gc->peak_memory_use < memory_in_use) gc->peak_memory_use = memory_in_use; if(gc->peak_memory_use < memory_in_use) gc->peak_memory_use = memory_in_use;
if(gc_full) if(gc->gc_full)
since_last_full = 0; since_last_full = 0;
else if((float)(memory_in_use - old_mem_use) < (0.1 * (float)old_mem_use)) else if((float)(memory_in_use - old_mem_use) < (0.1 * (float)old_mem_use))
since_last_full += 1; since_last_full += 1;
@ -2530,14 +2529,14 @@ static void garbage_collect(int force_full)
since_last_full += 5; since_last_full += 5;
else else
since_last_full += 10; since_last_full += 10;
if(gc_full) if(gc->gc_full)
last_full_mem_use = memory_in_use; last_full_mem_use = memory_in_use;
/* inform the system (if it wants us to) that we're done with collection */ /* inform the system (if it wants us to) that we're done with collection */
if (GC_collect_start_callback) if (GC_collect_start_callback)
GC_collect_end_callback(); GC_collect_end_callback();
if (GC_collect_inform_callback) if (GC_collect_inform_callback)
GC_collect_inform_callback(gc_full, old_mem_use + old_gen0, memory_in_use); GC_collect_inform_callback(gc->gc_full, old_mem_use + old_gen0, memory_in_use);
TIME_STEP("ended"); TIME_STEP("ended");

View File

@ -87,7 +87,8 @@ typedef struct NewGC {
int generations_available; int generations_available;
unsigned char full_needed_for_finalization :1; unsigned char full_needed_for_finalization :1;
unsigned char no_further_modifications:1; unsigned char no_further_modifications :1;
unsigned char gc_full :1; /* a flag saying if this is a full/major collection */
/* These collect information about memory usage, for use in GC_dump. */ /* These collect information about memory usage, for use in GC_dump. */
unsigned long peak_memory_use; unsigned long peak_memory_use;