195 |
|
|
196 |
scm_gc_cells_swept += cards_swept * (SCM_GC_CARD_N_CELLS - SCM_GC_CARD_N_HEADER_CELLS); |
scm_gc_cells_swept += cards_swept * (SCM_GC_CARD_N_CELLS - SCM_GC_CARD_N_HEADER_CELLS); |
197 |
scm_gc_cells_collected += collected * seg->span; |
scm_gc_cells_collected += collected * seg->span; |
198 |
|
|
199 |
|
if (!seg->first_time) |
200 |
|
scm_cells_allocated -= collected * seg->span; |
201 |
|
|
202 |
seg->freelist->collected += collected * seg->span; |
seg->freelist->collected += collected * seg->span; |
203 |
|
|
204 |
|
|
205 |
if(next_free == seg->bounds[1]) |
if(next_free == seg->bounds[1]) |
206 |
{ |
{ |
217 |
statistics, it just frees the memory pointed to by to-be-swept |
statistics, it just frees the memory pointed to by to-be-swept |
218 |
cells. |
cells. |
219 |
|
|
220 |
Implementation is slightly ugh, and how do we handle the swept_cells |
Implementation is slightly ugh. |
221 |
statistic? |
|
222 |
|
FIXME: if you do scm_i_sweep_segment(), and then allocate from this |
223 |
|
segment again, the statistics are off. |
224 |
*/ |
*/ |
225 |
void |
void |
226 |
scm_i_sweep_segment (scm_t_heap_segment * seg) |
scm_i_sweep_segment (scm_t_heap_segment * seg) |
228 |
scm_t_cell * p = seg->next_free_card; |
scm_t_cell * p = seg->next_free_card; |
229 |
int yield = scm_gc_cells_collected; |
int yield = scm_gc_cells_collected; |
230 |
int coll = seg->freelist->collected; |
int coll = seg->freelist->collected; |
231 |
|
int alloc = scm_cells_allocated ; |
232 |
|
|
233 |
while (scm_i_sweep_some_cards (seg) != SCM_EOL) |
while (scm_i_sweep_some_cards (seg) != SCM_EOL) |
234 |
; |
; |
235 |
|
|
236 |
scm_gc_cells_collected = yield; |
scm_gc_cells_collected = yield; |
237 |
|
scm_cells_allocated = alloc; |
238 |
seg->freelist->collected = coll; |
seg->freelist->collected = coll; |
239 |
|
|
240 |
seg->next_free_card =p; |
seg->next_free_card =p; |