diff options
author | Han-Wen Nienhuys <hanwen@lilypond.org> | 2006-02-14 11:38:30 +0000 |
---|---|---|
committer | Han-Wen Nienhuys <hanwen@lilypond.org> | 2006-02-14 11:38:30 +0000 |
commit | 4c7016dc06525c7910ce6c99d97eb9c52c6b43e4 (patch) | |
tree | 596b824412bf39911e8388ba60e85eba5029e817 /libguile/gc.c | |
parent | b712c10755ad4304f6352a32ec607c8fad1a61a9 (diff) | |
download | guile-4c7016dc06525c7910ce6c99d97eb9c52c6b43e4.tar.gz |
Ludovic's patch for scm_t_sweep_statistics.
Diffstat (limited to 'libguile/gc.c')
-rw-r--r-- | libguile/gc.c | 63 |
1 files changed, 39 insertions, 24 deletions
diff --git a/libguile/gc.c b/libguile/gc.c index 6141ff26c..1602be547 100644 --- a/libguile/gc.c +++ b/libguile/gc.c @@ -403,31 +403,32 @@ gc_start_stats (const char *what SCM_UNUSED) { t_before_gc = scm_c_get_internal_run_time (); - scm_gc_cells_marked_acc += (double) scm_gc_cells_swept - - (double) scm_gc_cells_collected; - scm_gc_cells_swept_acc += (double) scm_gc_cells_swept; - - scm_gc_cell_yield_percentage = ( scm_gc_cells_collected * 100 ) / SCM_HEAP_SIZE; - - scm_gc_cells_swept = 0; - scm_gc_cells_collected_1 = scm_gc_cells_collected; - - /* - CELLS SWEPT is another word for the number of cells that were - examined during GC. YIELD is the number that we cleaned - out. MARKED is the number that weren't cleaned. - */ - scm_gc_cells_collected = 0; scm_gc_malloc_collected = 0; scm_gc_ports_collected = 0; } static void -gc_end_stats () +gc_end_stats (scm_t_sweep_statistics sweep_stats) { unsigned long t = scm_c_get_internal_run_time (); scm_gc_time_taken += (t - t_before_gc); + /* + CELLS SWEPT is another word for the number of cells that were + examined during GC. YIELD is the number that we cleaned + out. MARKED is the number that weren't cleaned. + */ + scm_gc_cells_marked_acc += (double) sweep_stats.swept + - (double) scm_gc_cells_collected; + scm_gc_cells_swept_acc += (double) sweep_stats.swept; + + scm_gc_cell_yield_percentage = (sweep_stats.collected * 100) / SCM_HEAP_SIZE; + + scm_gc_cells_swept = sweep_stats.swept; + scm_gc_cells_collected_1 = scm_gc_cells_collected; + scm_gc_cells_collected = sweep_stats.collected; + scm_cells_allocated -= sweep_stats.collected; + ++scm_gc_times; } @@ -478,15 +479,19 @@ scm_gc_for_newcell (scm_t_cell_type_statistics *freelist, SCM *free_cells) { SCM cell; int did_gc = 0; - + scm_t_sweep_statistics sweep_stats; + scm_i_scm_pthread_mutex_lock (&scm_i_sweep_mutex); scm_gc_running_p = 1; - *free_cells = scm_i_sweep_some_segments (freelist); + *free_cells = scm_i_sweep_some_segments (freelist, &sweep_stats); + scm_cells_allocated -= sweep_stats.collected; + if (*free_cells == SCM_EOL && scm_i_gc_grow_heap_p (freelist)) { freelist->heap_segment_idx = scm_i_get_new_heap_segment (freelist, abort_on_error); - *free_cells = scm_i_sweep_some_segments (freelist); + *free_cells = scm_i_sweep_some_segments (freelist, &sweep_stats); + scm_cells_allocated -= sweep_stats.collected; } if (*free_cells == SCM_EOL) @@ -495,7 +500,7 @@ scm_gc_for_newcell (scm_t_cell_type_statistics *freelist, SCM *free_cells) with the advent of lazy sweep, GC yield is only known just before doing the GC. */ - scm_i_adjust_min_yield (freelist); + scm_i_adjust_min_yield (freelist, sweep_stats); /* out of fresh cells. Try to get some new ones. @@ -504,7 +509,8 @@ scm_gc_for_newcell (scm_t_cell_type_statistics *freelist, SCM *free_cells) did_gc = 1; scm_i_gc ("cells"); - *free_cells = scm_i_sweep_some_segments (freelist); + *free_cells = scm_i_sweep_some_segments (freelist, &sweep_stats); + scm_cells_allocated -= sweep_stats.collected; } if (*free_cells == SCM_EOL) @@ -513,7 +519,8 @@ scm_gc_for_newcell (scm_t_cell_type_statistics *freelist, SCM *free_cells) failed getting new cells. Get new juice or die. */ freelist->heap_segment_idx = scm_i_get_new_heap_segment (freelist, abort_on_error); - *free_cells = scm_i_sweep_some_segments (freelist); + *free_cells = scm_i_sweep_some_segments (freelist, &sweep_stats); + scm_cells_allocated -= sweep_stats.collected; } if (*free_cells == SCM_EOL) @@ -545,6 +552,8 @@ scm_t_c_hook scm_after_gc_c_hook; void scm_i_gc (const char *what) { + scm_t_sweep_statistics sweep_stats; + scm_i_thread_put_to_sleep (); scm_c_hook_run (&scm_before_gc_c_hook, 0); @@ -571,7 +580,12 @@ scm_i_gc (const char *what) Let's finish the sweep. The conservative GC might point into the garbage, and marking that would create a mess. */ - scm_i_sweep_all_segments("GC"); + scm_i_sweep_all_segments ("GC", &sweep_stats); + + /* Invariant: the number of cells collected (i.e., freed) must always be + lower than or equal to the number of cells "swept" (i.e., visited). */ + assert (sweep_stats.collected <= sweep_stats.swept); + if (scm_mallocated < scm_i_deprecated_memory_return) { /* The byte count of allocated objects has underflowed. This is @@ -624,7 +638,7 @@ scm_i_gc (const char *what) scm_gc_sweep (); scm_c_hook_run (&scm_after_sweep_c_hook, 0); - gc_end_stats (); + gc_end_stats (sweep_stats); scm_i_thread_wake_up (); @@ -635,6 +649,7 @@ scm_i_gc (const char *what) */ } + /* {GC Protection Helper Functions} */ |