void MFSFinishTracts(Pool pool, MFSTractVisitor visitor, void *closure) { MFS mfs = MustBeA(MFSPool, pool); while (mfs->tractList != NULL) { Tract nextTract = (Tract)TractP(mfs->tractList); /* .tract.chain */ visitor(pool, TractBase(mfs->tractList), mfs->extendBy, closure); mfs->tractList = nextTract; } }
Bool TractCheck(Tract tract) { if (TractHasPool(tract)) { CHECKU(Pool, TractPool(tract)); CHECKL(AddrIsArenaGrain(TractBase(tract), TractArena(tract))); } if (TractHasSeg(tract)) { CHECKL(TraceSetCheck(TractWhite(tract))); CHECKU(Seg, (Seg)TractP(tract)); } else { CHECKL(TractWhite(tract) == TraceSetEMPTY); } return TRUE; }
void MFSFinishTracts(Pool pool, MFSTractVisitor visitor, void *closureP, Size closureS) { MFS mfs; AVERT(Pool, pool); mfs = PoolPoolMFS(pool); AVERT(MFS, mfs); while (mfs->tractList != NULL) { Tract nextTract = (Tract)TractP(mfs->tractList); /* .tract.chain */ visitor(pool, TractBase(mfs->tractList), mfs->extendBy, closureP, closureS); mfs->tractList = nextTract; } }
Tract TractOfBaseAddr(Arena arena, Addr addr) { Tract tract = NULL; Bool found; AVERT_CRITICAL(Arena, arena); AVER_CRITICAL(AddrIsAligned(addr, ArenaGrainSize(arena))); /* Check first in the cache, see <design/arena/#tract.cache>. */ if (arena->lastTractBase == addr) { tract = arena->lastTract; } else { found = TractOfAddr(&tract, arena, addr); AVER_CRITICAL(found); } AVER_CRITICAL(TractBase(tract) == addr); return tract; }
Addr TractLimit(Tract tract, Arena arena) { AVERT_CRITICAL(Tract, tract); /* .tract.critical */ AVERT_CRITICAL(Arena, arena); return AddrAdd(TractBase(tract), ArenaGrainSize(arena)); }