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; } }
static Res SegAbsInit(Seg seg, Pool pool, Addr base, Size size, ArgList args) { Arena arena; Addr addr, limit; Tract tract; AVER(seg != NULL); AVERT(Pool, pool); arena = PoolArena(pool); AVER(AddrIsArenaGrain(base, arena)); AVER(SizeIsArenaGrains(size, arena)); AVERT(ArgList, args); NextMethod(Inst, Seg, init)(CouldBeA(Inst, seg)); limit = AddrAdd(base, size); seg->limit = limit; seg->rankSet = RankSetEMPTY; seg->white = TraceSetEMPTY; seg->nailed = TraceSetEMPTY; seg->grey = TraceSetEMPTY; seg->pm = AccessSetEMPTY; seg->sm = AccessSetEMPTY; seg->defer = WB_DEFER_INIT; seg->depth = 0; seg->queued = FALSE; seg->firstTract = NULL; RingInit(SegPoolRing(seg)); TRACT_FOR(tract, addr, arena, base, limit) { AVERT(Tract, tract); AVER(TractP(tract) == NULL); AVER(!TractHasSeg(tract)); AVER(TractPool(tract) == pool); AVER(TractWhite(tract) == TraceSetEMPTY); TRACT_SET_SEG(tract, seg); if (addr == base) { AVER(seg->firstTract == NULL); seg->firstTract = tract; } AVER(seg->firstTract != NULL); }