diff --git a/libguile/ChangeLog b/libguile/ChangeLog index 13e0836a3..a06959750 100644 --- a/libguile/ChangeLog +++ b/libguile/ChangeLog @@ -1,3 +1,15 @@ +2007-01-23 Han-Wen Nienhuys + + * gc.c (s_scm_gc_stats): return total cells allocated in a run as + 'total-cells-allocated in gc-stats output. This allows profiling + of a program's memory use. + + * gc-segment.c (scm_i_sweep_some_cards): update + scm_gc_cells_allocated_acc when sweeping happens. + + * gc.h: add scm_gc_cells_allocated_acc, scm_last_cells_allocated. + + 2007-01-19 Ludovic Courtès * struct.c (scm_i_struct_equalp): Skip comparison if both FIELD1 diff --git a/libguile/gc-segment.c b/libguile/gc-segment.c index db1c800f5..3bca00b8d 100644 --- a/libguile/gc-segment.c +++ b/libguile/gc-segment.c @@ -170,8 +170,13 @@ scm_i_sweep_some_cards (scm_t_heap_segment *seg) scm_gc_cells_collected += collected * seg->span; if (!seg->first_time) - scm_cells_allocated -= collected * seg->span; - + { + scm_gc_cells_allocated_acc += + (scm_cells_allocated - scm_last_cells_allocated); + + scm_cells_allocated -= collected * seg->span; + scm_last_cells_allocated = scm_cells_allocated; + } seg->freelist->collected += collected * seg->span; @@ -202,14 +207,24 @@ scm_i_sweep_segment (scm_t_heap_segment * seg) int yield = scm_gc_cells_collected; int coll = seg->freelist->collected; unsigned long alloc = scm_cells_allocated ; + unsigned long last_alloc = scm_last_cells_allocated; + double last_total + = scm_gc_cells_allocated_acc + + (alloc - last_alloc); while (scm_i_sweep_some_cards (seg) != SCM_EOL) ; - - scm_gc_cells_collected = yield; - scm_cells_allocated = alloc; - seg->freelist->collected = coll; + scm_gc_cells_collected = yield; + + /* + * restore old stats. + */ + scm_gc_cells_allocated_acc = last_total; + scm_cells_allocated = alloc; + scm_last_cells_allocated = alloc; + + seg->freelist->collected = coll; seg->next_free_card =p; } diff --git a/libguile/gc.c b/libguile/gc.c index 364dd39f2..f045bcc90 100644 --- a/libguile/gc.c +++ b/libguile/gc.c @@ -213,6 +213,7 @@ unsigned long scm_mtrigger; /* GC Statistics Keeping */ unsigned long scm_cells_allocated = 0; +unsigned long scm_last_cells_allocated; unsigned long scm_mallocated = 0; unsigned long scm_gc_cells_collected; unsigned long scm_gc_cells_collected_1 = 0; /* previous GC yield */ @@ -225,6 +226,7 @@ unsigned long scm_gc_times = 0; unsigned long scm_gc_cells_swept = 0; double scm_gc_cells_marked_acc = 0.; double scm_gc_cells_swept_acc = 0.; +double scm_gc_cells_allocated_acc = 0.; int scm_gc_cell_yield_percentage =0; int scm_gc_malloc_yield_percentage = 0; unsigned long protected_obj_count = 0; @@ -243,6 +245,7 @@ SCM_SYMBOL (sym_cells_swept, "cells-swept"); SCM_SYMBOL (sym_malloc_yield, "malloc-yield"); SCM_SYMBOL (sym_cell_yield, "cell-yield"); SCM_SYMBOL (sym_protected_objects, "protected-objects"); +SCM_SYMBOL (sym_total_cells_allocated, "total-cells-allocated"); @@ -315,6 +318,7 @@ SCM_DEFINE (scm_gc_stats, "gc-stats", 0, 0, 0, unsigned long int local_protected_obj_count; double local_scm_gc_cells_swept; double local_scm_gc_cells_marked; + double local_scm_total_cells_allocated; SCM answer; unsigned long *bounds = 0; int table_size = scm_i_heap_segment_table_size; @@ -356,6 +360,9 @@ SCM_DEFINE (scm_gc_stats, "gc-stats", 0, 0, 0, +(double) scm_gc_cells_swept -(double) scm_gc_cells_collected; + local_scm_total_cells_allocated = scm_gc_cells_allocated_acc + + (double) (scm_cells_allocated - scm_last_cells_allocated); + for (i = table_size; i--;) { heap_segs = scm_cons (scm_cons (scm_from_ulong (bounds[2*i]), @@ -369,6 +376,8 @@ SCM_DEFINE (scm_gc_stats, "gc-stats", 0, 0, 0, scm_from_ulong (local_scm_gc_time_taken)), scm_cons (sym_cells_allocated, scm_from_ulong (local_scm_cells_allocated)), + scm_cons (sym_total_cells_allocated, + scm_from_ulong (local_scm_total_cells_allocated)), scm_cons (sym_heap_size, scm_from_ulong (local_scm_heap_size)), scm_cons (sym_mallocated, diff --git a/libguile/gc.h b/libguile/gc.h index 439cf8a4b..821d174d6 100644 --- a/libguile/gc.h +++ b/libguile/gc.h @@ -278,10 +278,12 @@ SCM_API unsigned long scm_gc_cells_collected; SCM_API unsigned long scm_gc_malloc_collected; SCM_API unsigned long scm_gc_ports_collected; SCM_API unsigned long scm_cells_allocated; +SCM_API unsigned long scm_last_cells_allocated; SCM_API int scm_gc_cell_yield_percentage; SCM_API int scm_gc_malloc_yield_percentage; SCM_API unsigned long scm_mallocated; SCM_API unsigned long scm_mtrigger; +SCM_API double scm_gc_cells_allocated_acc;