static void check(FBMState state) { CheckFBMClosureStruct closure; closure.state = state; closure.limit = addrOfIndex(state, ArraySize); closure.oldLimit = state->block; switch (state->type) { case FBMTypeCBS: CBSIterate(state->the.cbs, checkCBSCallback, (void *)&closure, 0); break; case FBMTypeFreelist: FreelistIterate(state->the.fl, checkFLCallback, (void *)&closure, 0); break; default: fail(); return; } if (closure.oldLimit == state->block) Insist(BTIsSetRange(state->allocTable, 0, indexOfAddr(state, closure.limit))); else if (closure.limit > closure.oldLimit) Insist(BTIsSetRange(state->allocTable, indexOfAddr(state, closure.oldLimit), indexOfAddr(state, closure.limit))); else Insist(closure.oldLimit == closure.limit); }
static void checkCBS(CBS cbs, BT allocTable, Addr dummyBlock) { CheckCBSClosureStruct closure; closure.allocTable = allocTable; closure.base = dummyBlock; closure.limit = addrOfIndex(closure.base, ArraySize); closure.oldLimit = closure.base; CBSIterate(cbs, checkCBSAction, (void *)&closure); if (closure.oldLimit == closure.base) Insist(BTIsSetRange(allocTable, 0, indexOfAddr(dummyBlock, closure.limit))); else if (closure.limit > closure.oldLimit) Insist(BTIsSetRange(allocTable, indexOfAddr(dummyBlock, closure.oldLimit), indexOfAddr(dummyBlock, closure.limit))); else Insist(closure.oldLimit == closure.limit); }