summaryrefslogtreecommitdiff
path: root/libguile/gc-segment.c
diff options
context:
space:
mode:
Diffstat (limited to 'libguile/gc-segment.c')
-rw-r--r--libguile/gc-segment.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/libguile/gc-segment.c b/libguile/gc-segment.c
index a3859df7b..d3a48f2ab 100644
--- a/libguile/gc-segment.c
+++ b/libguile/gc-segment.c
@@ -195,7 +195,12 @@ scm_i_sweep_some_cards (scm_t_heap_segment *seg)
scm_gc_cells_swept += cards_swept * (SCM_GC_CARD_N_CELLS - SCM_GC_CARD_N_HEADER_CELLS);
scm_gc_cells_collected += collected * seg->span;
+
+ if (!seg->first_time)
+ scm_cells_allocated -= collected * seg->span;
+
seg->freelist->collected += collected * seg->span;
+
if(next_free == seg->bounds[1])
{
@@ -212,8 +217,10 @@ scm_i_sweep_some_cards (scm_t_heap_segment *seg)
statistics, it just frees the memory pointed to by to-be-swept
cells.
- Implementation is slightly ugh, and how do we handle the swept_cells
- statistic?
+ Implementation is slightly ugh.
+
+ FIXME: if you do scm_i_sweep_segment(), and then allocate from this
+ segment again, the statistics are off.
*/
void
scm_i_sweep_segment (scm_t_heap_segment * seg)
@@ -221,11 +228,13 @@ scm_i_sweep_segment (scm_t_heap_segment * seg)
scm_t_cell * p = seg->next_free_card;
int yield = scm_gc_cells_collected;
int coll = seg->freelist->collected;
-
+ int alloc = scm_cells_allocated ;
+
while (scm_i_sweep_some_cards (seg) != SCM_EOL)
;
scm_gc_cells_collected = yield;
+ scm_cells_allocated = alloc;
seg->freelist->collected = coll;
seg->next_free_card =p;