/* -----------------------------------------------------------------------------
Scavenge a block from the given scan pointer up to bd->free.
- evac_gen is set by the caller to be either zero (for a step in a
+ evac_gen_no is set by the caller to be either zero (for a step in a
generation < N) or G where G is the generation of the step being
scavenged.
- We sometimes temporarily change evac_gen back to zero if we're
+ We sometimes temporarily change evac_gen_no back to zero if we're
scavenging a mutable object where eager promotion isn't such a good
idea.
-------------------------------------------------------------------------- */
bd->start, bd->gen_no, bd->u.scan);
gct->scan_bd = bd;
- gct->evac_gen = bd->gen;
+ gct->evac_gen_no = bd->gen_no;
saved_eager_promotion = gct->eager_promotion;
gct->failed_to_evac = rtsFalse;
StgInfoTable *info;
rtsBool saved_eager_promotion;
- gct->evac_gen = oldest_gen;
+ gct->evac_gen_no = oldest_gen->no;
saved_eager_promotion = gct->eager_promotion;
while ((p = pop_mark_stack())) {
if (gct->failed_to_evac) {
gct->failed_to_evac = rtsFalse;
- if (gct->evac_gen) {
- recordMutableGen_GC((StgClosure *)q, gct->evac_gen->no);
+ if (gct->evac_gen_no) {
+ recordMutableGen_GC((StgClosure *)q, gct->evac_gen_no);
}
}
} // while (p = pop_mark_stack())
scavenge_mutable_list(bdescr *bd, generation *gen)
{
StgPtr p, q;
+ nat gen_no;
- gct->evac_gen = gen;
+ gen_no = gen->no;
+ gct->evac_gen_no = gen_no;
for (; bd != NULL; bd = bd->link) {
for (q = bd->start; q < bd->free; q++) {
p = (StgPtr)*q;
//
switch (get_itbl((StgClosure *)p)->type) {
case MUT_ARR_PTRS_CLEAN:
- recordMutableGen_GC((StgClosure *)p,gen->no);
+ recordMutableGen_GC((StgClosure *)p,gen_no);
continue;
case MUT_ARR_PTRS_DIRTY:
{
gct->eager_promotion = saved_eager_promotion;
gct->failed_to_evac = rtsFalse;
- recordMutableGen_GC((StgClosure *)p,gen->no);
+ recordMutableGen_GC((StgClosure *)p,gen_no);
continue;
}
default:
if (scavenge_one(p)) {
// didn't manage to promote everything, so put the
// object back on the list.
- recordMutableGen_GC((StgClosure *)p,gen->no);
+ recordMutableGen_GC((StgClosure *)p,gen_no);
}
}
}
/* Always evacuate straight to the oldest generation for static
* objects */
- gct->evac_gen = oldest_gen;
+ gct->evac_gen_no = oldest_gen->no;
/* keep going until we've scavenged all the objects on the linked
list... */
bdescr *bd;
StgPtr p;
- gct->evac_gen = ws->gen;
+ gct->evac_gen_no = ws->gen->no;
bd = ws->todo_large_objects;
// the front when evacuating.
ws->todo_large_objects = bd->link;
- ACQUIRE_SPIN_LOCK(&ws->gen->sync_large_objects);
+ ACQUIRE_SPIN_LOCK(&ws->gen->sync);
dbl_link_onto(bd, &ws->gen->scavenged_large_objects);
ws->gen->n_scavenged_large_blocks += bd->blocks;
- RELEASE_SPIN_LOCK(&ws->gen->sync_large_objects);
+ RELEASE_SPIN_LOCK(&ws->gen->sync);
p = bd->start;
if (scavenge_one(p)) {