* necessary.
*/
to = ws->todo_free;
- if (to + size > ws->todo_lim) {
+ ws->todo_free += size;
+ if (ws->todo_free > ws->todo_lim) {
to = todo_block_full(size, ws);
}
- ws->todo_free = to + size;
ASSERT(ws->todo_free >= ws->todo_bd->free && ws->todo_free <= ws->todo_lim);
return to;
StgPtr
todo_block_full (nat size, step_workspace *ws)
{
+ StgPtr p;
bdescr *bd;
+ // todo_free has been pre-incremented by Evac.c:alloc_for_copy(). We
+ // are expected to leave it bumped when we've finished here.
+ ws->todo_free -= size;
+
bd = ws->todo_bd;
ASSERT(bd != NULL);
ws->todo_lim = stg_min(bd->start + BLOCK_SIZE_W,
ws->todo_lim + stg_max(WORK_UNIT_WORDS,size));
debugTrace(DEBUG_gc, "increasing limit for %p to %p", bd->start, ws->todo_lim);
- return ws->todo_free;
+ p = ws->todo_free;
+ ws->todo_free += size;
+ return p;
}
}
alloc_todo_block(ws, size);
- return ws->todo_free;
+ p = ws->todo_free;
+ ws->todo_free += size;
+ return p;
}
StgPtr