static void objRemove(void **objReturn, objectTable table, void *logObj, size_t size) { Bool found; Res ires; void *obj; void *end; void *logEnd; found = TableLookup(&obj, table->startTable, (Word)logObj); if (found) { ires = TableRemove(table->startTable, (Word)logObj); verify(ires == ResOK); if (table->endTable != NULL) { ires = TableRemove(table->endTable, (Word)PointerAdd(logObj, size)); verify(ires == ResOK); } *objReturn = obj; return; } /* Must be a truncation. */ verify(table->endTable != NULL); logEnd = PointerAdd(logObj, size); found = TableLookup(&end, table->endTable, (Word)logEnd); verify(found); obj = PointerSub(end, size); /* Remove the old end and insert the new one. */ ires = TableRemove(table->endTable, (Word)logEnd); verify(ires == ResOK); ires = TableDefine(table->endTable, (Word)logObj, obj); verify(ires == ResOK); *objReturn = obj; return; }
static void objDefine(objectTable table, void *logObj, void *obj, size_t size) { if (table != NULL) { Res ires; ires = TableDefine(table->startTable, (Word)logObj, obj); verify(ires == ResOK); if (table->endTable != NULL) { ires = TableDefine(table->endTable, (Word)PointerAdd(logObj, size), PointerAdd(obj, size)); verify(ires == ResOK); } } }
void VMFinish(VM vm) { BOOL b; AVERT(VM, vm); /* Descriptor must not be stored inside its own VM at this point. */ AVER(PointerAdd(vm, sizeof *vm) <= vm->block || PointerAdd(vm->block, VMReserved(vm)) <= (Pointer)vm); /* All address space must have been unmapped. */ AVER(VMMapped(vm) == (Size)0); EVENT1(VMFinish, vm); vm->sig = SigInvalid; b = VirtualFree((LPVOID)vm->block, (SIZE_T)0, MEM_RELEASE); AVER(b != 0); }