Bool EPVMSegCheck(EPVMSeg epvmSeg) { Seg seg; CHECKS(EPVMSeg, epvmSeg); CHECKL(AMSSegCheck(&epvmSeg->amsSegStruct)); seg = EPVMSeg2Seg(epvmSeg); CHECKU(EPVMSave, epvmSeg->save); CHECKL(epvmSeg->save->size >= SegSize(seg)); /* buffers only on the current save level */ if (SegBuffer(seg) != NULL) CHECKL(EPVMCurrentSave(EPVMSegEPVM(epvmSeg)) == epvmSeg->save); /* See design.mps.poolepvm.protection.format and */ /* d.m.p.protection.hack. */ AVER(SegSummary(seg) == RefSetUNIV || SegSummary(seg) == RefSetEMPTY); return TRUE; }
/* ArenaExposeRemember -- park arena and then lift all protection barriers. Parameter 'remember' specifies whether to remember the protection state or not (for later restoration with ArenaRestoreProtection). */ void ArenaExposeRemember(Globals globals, Bool remember) { Seg seg; Arena arena; AVERT(Globals, globals); AVERT(Bool, remember); ArenaPark(globals); arena = GlobalsArena(globals); if(SegFirst(&seg, arena)) { Addr base; do { base = SegBase(seg); if (IsA(GCSeg, seg)) { if(remember) { RefSet summary; summary = SegSummary(seg); if(summary != RefSetUNIV) { Res res = arenaRememberSummaryOne(globals, base, summary); if(res != ResOK) { /* If we got an error then stop trying to remember any protections. */ remember = 0; } } } SegSetSummary(seg, RefSetUNIV); AVER(SegSM(seg) == AccessSetEMPTY); } } while(SegNext(&seg, arena, seg)); } }