From 92c70c84583cdaf660bddab25bbb0db720f6a2fc Mon Sep 17 00:00:00 2001 From: Richard Brooksby Date: Tue, 25 Feb 1997 18:28:21 +0000 Subject: [PATCH] Merging mmdevel_bitset Copied from Perforce Change: 16806 ServerID: perforce.ravenbrook.com --- mps/src/ld.c | 12 +++++------ mps/src/misc.h | 32 ++++++++++++++++++++++++---- mps/src/mpm.h | 52 ++++++++++++++++++++++------------------------ mps/src/mpmtypes.h | 6 ++++-- mps/src/poolmrg.c | 8 +++---- mps/src/ref.c | 6 +++--- mps/src/root.c | 6 +++--- mps/src/trace.c | 16 +++++++------- 8 files changed, 81 insertions(+), 57 deletions(-) diff --git a/mps/src/ld.c b/mps/src/ld.c index ccd0bf7eecc..4dc23940592 100644 --- a/mps/src/ld.c +++ b/mps/src/ld.c @@ -1,6 +1,6 @@ /* impl.c.ld: LOCATION DEPENDENCY IMPLEMENTATION * - * $HopeName: MMsrc!ld.c(trunk.3) $ + * $HopeName: MMsrc!ld.c(trunk.4) $ * Copyright (C) 1996 Harlequin Group, all rights reserved. * * .def: A location dependency records the fact that the bit-patterns @@ -48,7 +48,7 @@ #include "mpm.h" -SRCID(ld, "$HopeName: MMsrc!ld.c(trunk.3) $"); +SRCID(ld, "$HopeName: MMsrc!ld.c(trunk.4) $"); /* LDReset -- reset a dependency to empty @@ -71,7 +71,7 @@ void LDReset(LD ld, Space space) ShieldExpose(space, seg); /* .ld.access */ } ld->epoch = space->epoch; - ld->rs = RefSetEmpty; + ld->rs = RefSetEMPTY; if(b) { ShieldCover(space, seg); } @@ -151,7 +151,7 @@ Bool LDIsStale(LD ld, Space space, Addr addr) rs = space->prehistory; /* .stale.old */ } - return RefSetInter(ld->rs, rs) != RefSetEmpty; + return RefSetInter(ld->rs, rs) != RefSetEMPTY; } @@ -166,12 +166,12 @@ void LDAge(Space space, RefSet rs) Size i; AVERT(Space, space); - AVER(rs != RefSetEmpty); + AVER(rs != RefSetEMPTY); /* Replace the entry for epoch - SPACE_LD_LENGTH by an empty */ /* set which will become the set which has moved since the */ /* current epoch. */ - space->history[space->epoch % SPACE_LD_LENGTH] = RefSetEmpty; + space->history[space->epoch % SPACE_LD_LENGTH] = RefSetEMPTY; /* Record the fact that the moved set has moved, by adding it */ /* to all the sets in the history, including the set for the */ diff --git a/mps/src/misc.h b/mps/src/misc.h index 42e502c774c..ed95910ec51 100644 --- a/mps/src/misc.h +++ b/mps/src/misc.h @@ -1,6 +1,6 @@ /* impl.h.misc: MISCELLANEOUS DEFINITIONS * - * $HopeName: MMsrc!misc.h(trunk.6) $ + * $HopeName: MMsrc!misc.h(trunk.7) $ * Copyright (C) 1994,1995,1996 Harlequin Group, all rights reserved * * Small general things which are useful for C but aren't part of the @@ -66,11 +66,13 @@ typedef const struct SrcIdStruct { /* UNUSED -- declare parameter unused * * This macro supresses warnings about unused parameters. It should be - * applied to the parameter at the beginning of the body of the procedure. + * applied to the parameter at the beginning of the body of the + * procedure. * * The cast to void appears to work for GCC, MSVC, and CodeWarrior. - * It's a shame there's no way to ensure that the parameter won't be used. - * We could scramble it, but that's undesirable in release versions. + * It's a shame there's no way to ensure that the parameter won't be + * used. We could scramble it, but that's undesirable in release + * versions. */ #define UNUSED(param) ((void)param) @@ -88,4 +90,26 @@ typedef const struct SrcIdStruct { ((type *)((char *)(p) - offsetof(type, field))) +/* Bit Sets -- sets of integers in [0,N-1]. + * + * Can be used on any unsigned integral type, ty. These defintions + * are _syntactic_, hence macroid, hence upper case + * (guide.c.naming.macro.special). + */ + +#define BS_EMPTY(ty) ((ty)0) +#define BS_COMP(s) (~(s)) +#define BS_UNIV(ty) BS_COMP(BS_EMPTY(ty)) +#define BS_SINGLE(ty, i) ((ty)1 << (i)) +#define BS_IS_MEMBER(s, i) (((s) >> (i)) & 1) +#define BS_UNION(s1, s2) ((s1) | (s2)) +#define BS_ADD(ty, s, i) BS_UNION(s, BS_SINGLE(ty, i)) +#define BS_INTER(s1, s2) ((s1) & (s2)) +#define BS_DIFF(s1, s2) BS_INTER(s1, BS_COMP(s2)) +#define BS_DEL(ty, s, i) BS_DIFF(s, BS_SINGLE(ty, i)) +#define BS_SUPER(s1, s2) (BS_INTER(s1, s2) == s2) +#define BS_SUB(s1, s2) BS_SUPER(s2, s1) +#define BS_IS_SINGLE(i) (((i) & (i)-1) == 0) + + #endif /* misc_h */ diff --git a/mps/src/mpm.h b/mps/src/mpm.h index 7aadbc44f26..585783e4660 100644 --- a/mps/src/mpm.h +++ b/mps/src/mpm.h @@ -1,6 +1,6 @@ /* impl.h.mpm: MEMORY POOL MANAGER DEFINITIONS * - * $HopeName: MMsrc!mpm.h(trunk.15) $ + * $HopeName: MMsrc!mpm.h(trunk.16) $ * Copyright (C) 1996 Harlequin Group, all rights reserved. */ @@ -45,7 +45,7 @@ extern Bool BoolCheck(Bool b); extern Bool FunCheck(Fun f); extern Bool AttrCheck(Attr attr); extern Bool RootVarCheck(RootVar rootVar); -#define FUNCHECK(f) (FunCheck((Fun)f)) +#define FUNCHECK(f) (FunCheck((Fun)f)) /* Address/Size Interface -- see impl.c.mpm */ @@ -183,7 +183,7 @@ extern Align (PoolAlignment)(Pool pool); #define PoolAlignment(pool) ((pool)->alignment) extern Ring (PoolSegRing)(Pool pool); -#define PoolSegRing(pool) (&(pool)->segRing) +#define PoolSegRing(pool) (&(pool)->segRing) extern Res PoolSegAlloc(Seg *segReturn, Pool pool, Size size); extern void PoolSegFree(Pool pool, Seg seg); @@ -232,17 +232,15 @@ extern void PoolNoAccess(Pool pool, Seg seg, AccessSet mode); /* Trace Interface -- see impl.c.trace */ -extern TraceSet (TraceSetAdd)(TraceSet set, TraceId id); -#define TraceSetAdd(set, id) ((set) | ((TraceSet)1 << (id))) +#define TraceSetIsMember(ts, ti)BS_IS_MEMBER(ts, ti) +#define TraceSetAdd(ts, ti) BS_ADD(TraceSet, ts, ti) +#define TraceSetDel(ts, ti) BS_DEL(TraceSet, ts, ti) +#define TraceSetUnion(ts1, ts2) BS_UNION(ts1, ts2) -extern TraceSet (TraceSetDelete)(TraceSet set, TraceId id); -#define TraceSetDelete(set, id) ((set) & ~((TraceSet)1 << (id))) - -extern Bool (TraceSetIsMember)(TraceSet set, TraceId id); -#define TraceSetIsMember(set, id) (((set) >> (id)) & 1) - -extern TraceSet (TraceSetUnion)(TraceSet set1, TraceSet set2); -#define TraceSetUnion(set1, set2) ((set1) | (set2)) +extern TraceSet (TraceSetAdd)(TraceSet ts, TraceId id); +extern TraceSet (TraceSetDel)(TraceSet ts, TraceId id); +extern TraceSet (TraceSetUnion)(TraceSet ts1, TraceSet ts2); +extern Bool (TraceSetIsMember)(TraceSet ts, TraceId id); extern Res TraceCreate(TraceId *tiReturn, Space space); extern void TraceDestroy(Space space, TraceId ti); @@ -354,23 +352,23 @@ extern void BufferReset(Buffer buffer); extern Bool BufferIsReset(Buffer buffer); extern Bool BufferIsReady(Buffer buffer); extern AP (BufferAP)(Buffer buffer); -#define BufferAP(buffer) (&(buffer)->apStruct) +#define BufferAP(buffer) (&(buffer)->apStruct) extern Buffer BufferOfAP(AP ap); extern Space BufferSpace(Buffer buffer); extern Pool (BufferPool)(Buffer buffer); -#define BufferPool(buffer) ((buffer)->pool) +#define BufferPool(buffer) ((buffer)->pool) extern Seg (BufferSeg)(Buffer buffer); -#define BufferSeg(buffer) ((buffer)->seg) +#define BufferSeg(buffer) ((buffer)->seg) extern Rank (BufferRank)(Buffer buffer); -#define BufferRank(buffer) ((buffer)->rank) +#define BufferRank(buffer) ((buffer)->rank) extern Addr (BufferBase)(Buffer buffer); -#define BufferBase(buffer) ((buffer)->base) +#define BufferBase(buffer) ((buffer)->base) extern Addr (BufferGetInit)(Buffer buffer); -#define BufferGetInit(buffer) (BufferAP(buffer)->init) +#define BufferGetInit(buffer) (BufferAP(buffer)->init) extern Addr (BufferAlloc)(Buffer buffer); -#define BufferAlloc(buffer) (BufferAP(buffer)->alloc) +#define BufferAlloc(buffer) (BufferAP(buffer)->alloc) extern Addr (BufferLimit)(Buffer buffer); -#define BufferLimit(buffer) (BufferAP(buffer)->limit) +#define BufferLimit(buffer) (BufferAP(buffer)->limit) /* Format Interface -- see impl.c.format */ @@ -393,16 +391,16 @@ extern Res FormatDescribe(Format format, mps_lib_FILE *stream); extern Bool RankCheck(Rank rank); -#define RefSetEmpty ((RefSet)0) -#define RefSetUniv ((RefSet)-1) -#define RefSetUnion(rs1, rs2) ((rs1) | (rs2)) -#define RefSetInter(rs1, rs2) ((rs1) & (rs2)) #define RefSetZone(space, addr) \ (((Word)(addr) >> space->zoneShift) & (WORD_WIDTH - 1)) +#define RefSetUnion(rs1, rs2) BS_UNION(rs1, rs2) +#define RefSetInter(rs1, rs2) BS_INTER(rs1, rs2) #define RefSetAdd(space, rs, addr) \ - ((rs) | ((RefSet)1 << RefSetZone(space, addr))) + BS_ADD(RefSet, rs, RefSetZone(space, addr)) #define RefSetIsMember(space, rs, addr) \ - (((rs) >> RefSetZone(space, addr)) & 1) + BS_IS_MEMBER(rs, RefSetZone(space, addr)) +#define RefSetSuper(rs1, rs2) BS_SUPER(rs1, rs2) + extern RefSet RefSetOfSeg(Space space, Seg seg); diff --git a/mps/src/mpmtypes.h b/mps/src/mpmtypes.h index 468b55017be..a0b70c45396 100644 --- a/mps/src/mpmtypes.h +++ b/mps/src/mpmtypes.h @@ -1,6 +1,6 @@ /* impl.h.mpmtypes: MEMORY POOL MANAGER TYPES * - * $HopeName: MMsrc!mpmtypes.h(trunk.10) $ + * $HopeName: MMsrc!mpmtypes.h(trunk.11) $ * Copyright (C) 1996 Harlequin Group, all rights reserved. * * .readership: MM developers. @@ -117,7 +117,9 @@ typedef Res (*RootScanRegMethod)(ScanState ss, Thread thread, void *p, #define AccessWRITE ((AccessSet)(1<<1)) #define RingNONE ((Ring)0) /* design.mps.ring */ #define TraceIdNONE ((TraceId)-1) /* design.mps.tracer */ -#define TraceSetEMPTY ((TraceSet)0) /* design.mps.tracer */ +#define RefSetEMPTY BS_EMPTY(RefSet) +#define RefSetUNIV BS_UNIV(RefSet) +#define TraceSetEMPTY BS_EMPTY(TraceSet) /* design.mps.tracer */ #define AttrFMT ((Attr)(1<<0)) /* design.mps.type.attr */ #define AttrSCAN ((Attr)(1<<1)) #define AttrPM_NO_READ ((Attr)(1<<2)) diff --git a/mps/src/poolmrg.c b/mps/src/poolmrg.c index 948f90cd3a5..97f0973632f 100644 --- a/mps/src/poolmrg.c +++ b/mps/src/poolmrg.c @@ -2,7 +2,7 @@ * * MANUAL RANK GUARDIAN POOL * - * $HopeName: MMsrc!poolmrg.c(trunk.1) $ + * $HopeName: MMsrc!poolmrg.c(trunk.2) $ * Copyright(C) 1995,1997 Harlequin Group, all rights reserved * * READERSHIP @@ -35,7 +35,7 @@ #include "poolmrg.h" -SRCID(poolmrg, "$HopeName: MMsrc!poolmrg.c(trunk.1) $"); +SRCID(poolmrg, "$HopeName: MMsrc!poolmrg.c(trunk.2) $"); #define MRGSig ((Sig)0x519B0349) @@ -209,7 +209,7 @@ static Res MRGGroupScan(ScanState ss, MRGGroup group, MRG mrg) } } TRACE_SCAN_END(ss); - group->grey = TraceSetDelete(group->grey, ss->traceId); + group->grey = TraceSetDel(group->grey, ss->traceId); ShieldLower(space, group->refseg, AccessREAD | AccessWRITE); ShieldCover(space, group->refseg); @@ -469,7 +469,7 @@ static void MRGAccess(Pool pool, Seg seg, AccessSet mode) ss.fix = TraceFix; ss.zoneShift = space->zoneShift; - ss.summary = RefSetEmpty; + ss.summary = RefSetEMPTY; ss.space = space; ss.sig = ScanStateSig; ss.rank = RankEXACT; /* .access.exact */ diff --git a/mps/src/ref.c b/mps/src/ref.c index 601e331428a..e5b4a5a2947 100644 --- a/mps/src/ref.c +++ b/mps/src/ref.c @@ -1,6 +1,6 @@ /* impl.c.ref: REFERENCES * - * $HopeName: MMsrc!ref.c(MMdevel_restr.4) $ + * $HopeName: MMsrc!ref.c(trunk.4) $ * Copyright (C) 1995 Harlequin Group, all rights reserved * * Ref is an alias for Addr which can be used to document where @@ -24,7 +24,7 @@ #include "mpm.h" -SRCID(ref, "$HopeName: MMsrc!ref.c(MMdevel_restr.4) $"); +SRCID(ref, "$HopeName: MMsrc!ref.c(trunk.4) $"); Bool RankCheck(Rank rank) { @@ -63,7 +63,7 @@ RefSet RefSetOfSeg(Space space, Seg seg) limit = (((Word)SegLimit(space, seg)-1) >> space->zoneShift) + 1; if(limit - base >= WORD_WIDTH) /* .rsos.univ */ - return RefSetUniv; + return RefSetUNIV; base &= WORD_WIDTH - 1; limit &= WORD_WIDTH - 1; diff --git a/mps/src/root.c b/mps/src/root.c index b0ee40bd3f0..db64b22562a 100644 --- a/mps/src/root.c +++ b/mps/src/root.c @@ -2,7 +2,7 @@ * * ROOT IMPLEMENTATION * - * $HopeName: MMsrc!root.c(trunk.17) $ + * $HopeName: MMsrc!root.c(trunk.18) $ * * Copyright (C) 1995,1996 Harlequin Group, all rights reserved * @@ -13,7 +13,7 @@ #include "mpm.h" -SRCID(root, "$HopeName: MMsrc!root.c(trunk.17) $"); +SRCID(root, "$HopeName: MMsrc!root.c(trunk.18) $"); /* .rootcheck: Keep synchonized with impl.h.mpmst.root */ Bool RootCheck(Root root) @@ -251,7 +251,7 @@ Res RootScan(ScanState ss, Root root) NOTREACHED; } - root->grey = TraceSetDelete(root->grey, ss->traceId); + root->grey = TraceSetDel(root->grey, ss->traceId); return ResOK; } diff --git a/mps/src/trace.c b/mps/src/trace.c index b1bf4345750..16cd9620878 100644 --- a/mps/src/trace.c +++ b/mps/src/trace.c @@ -1,11 +1,11 @@ /* impl.c.trace: GENERIC TRACER IMPLEMENTATION * - * $HopeName: MMsrc!trace.c(trunk.17) $ + * $HopeName: MMsrc!trace.c(trunk.18) $ */ #include "mpm.h" -SRCID(trace, "$HopeName: MMsrc!trace.c(trunk.17) $"); +SRCID(trace, "$HopeName: MMsrc!trace.c(trunk.18) $"); Bool ScanStateCheck(ScanState ss) { @@ -46,7 +46,7 @@ Res TraceCreate(TraceId *tiReturn, Space space) return ResLIMIT; found: - space->trace[ti].condemned = RefSetEmpty; + space->trace[ti].condemned = RefSetEMPTY; space->busyTraces = TraceSetAdd(space->busyTraces, ti); *tiReturn = ti; @@ -56,7 +56,7 @@ found: void TraceDestroy(Space space, TraceId ti) { AVERT(Space, space); - space->busyTraces = TraceSetDelete(space->busyTraces, ti); + space->busyTraces = TraceSetDel(space->busyTraces, ti); } Res TraceFlip(Space space, TraceId ti, RefSet condemned) @@ -72,7 +72,7 @@ Res TraceFlip(Space space, TraceId ti, RefSet condemned) ShieldSuspend(space); trace = &space->trace[ti]; - AVER(trace->condemned == RefSetEmpty); + AVER(trace->condemned == RefSetEMPTY); trace->condemned = condemned; /* Update location dependency structures. condemned is @@ -111,7 +111,7 @@ Res TraceFlip(Space space, TraceId ti, RefSet condemned) ss.fix = TraceFix; ss.zoneShift = space->zoneShift; ss.condemned = space->trace[ti].condemned; - ss.summary = RefSetEmpty; + ss.summary = RefSetEMPTY; ss.space = space; ss.traceId = ti; ss.weakSplat = (Addr)0xadd4badd; @@ -177,7 +177,7 @@ Size TracePoll(Space space, TraceId ti) trace = &space->trace[ti]; - if(trace->condemned != RefSetEmpty) { + if(trace->condemned != RefSetEMPTY) { res = TraceRun(space, ti, &finished); AVER(res == ResOK); /* @@@@ */ if(finished) { @@ -289,7 +289,7 @@ Res TraceRun(Space space, TraceId ti, Bool *finishedReturn) ss.fix = TraceFix; ss.zoneShift = space->zoneShift; ss.condemned = space->trace[ti].condemned; - ss.summary = RefSetEmpty; + ss.summary = RefSetEMPTY; ss.space = space; ss.traceId = ti; ss.sig = ScanStateSig;