From e97938d0dec2b2d19d8d2b6a90700a9e9440aee9 Mon Sep 17 00:00:00 2001 From: David Jones Date: Wed, 17 Feb 1999 15:37:51 +0000 Subject: [PATCH] Merging from jackdaw, shield erroneously checks non-invariants, change.dylan.jackdaw.1.170601 Copied from Perforce Change: 20563 ServerID: perforce.ravenbrook.com --- mps/src/shield.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/mps/src/shield.c b/mps/src/shield.c index 6c3bed905fa..38d1fb384ba 100644 --- a/mps/src/shield.c +++ b/mps/src/shield.c @@ -1,6 +1,6 @@ /* impl.c.shield: SHIELD IMPLEMENTATION * - * $HopeName: MMsrc!shield.c(trunk.12) $ + * $HopeName: MMsrc!shield.c(trunk.13) $ * Copyright (C) 1997 The Harlequin Group Limited. All rights reserved. * * See: idea.shield, design.mps.shield. @@ -73,7 +73,7 @@ #include "mpm.h" -SRCID(shield, "$HopeName: MMsrc!shield.c(trunk.12) $"); +SRCID(shield, "$HopeName: MMsrc!shield.c(trunk.13) $"); void (ShieldSuspend)(Arena arena) @@ -179,21 +179,23 @@ static void cache(Arena arena, Seg seg) void (ShieldRaise) (Arena arena, Seg seg, AccessSet mode) { - AVERT(Arena, arena); - AVERT(Seg, seg); + /* .seg.broken: Seg's shield invariants may not be true at */ + /* this point (this function is called to enforce them) so we */ + /* can't check seg. Nor can we check arena as that checks the */ + /* segs in the cache. */ AVER((SegSM(seg) & mode) == AccessSetEMPTY); SegSetSM(seg, SegSM(seg) | mode); /* inv.prot.shield preserved */ /* ensure inv.unsynced.suspended & inv.unsynced.depth */ cache(arena, seg); + AVERT(Arena, arena); + AVERT(Seg, seg); } void (ShieldLower)(Arena arena, Seg seg, AccessSet mode) { - AVERT(Arena, arena); - AVERT(Seg, seg); - + /* Don't check seg or arena, see .seg.broken */ AVER((SegSM(seg) & mode) == mode); /* synced(seg) is not changed by the following * preserving inv.unsynced.suspended @@ -201,6 +203,8 @@ void (ShieldLower)(Arena arena, Seg seg, AccessSet mode) */ SegSetSM(seg, SegSM(seg) & ~mode); protLower(arena, seg, mode); + AVERT(Arena, arena); + AVERT(Seg, seg); } void (ShieldEnter)(Arena arena)