<> <> <> <> DIRECTORY RCMap USING[Base, Index], SymbolTable USING[Base], Symbols USING[SEIndex, MDIndex]; RCMapOps: DEFINITIONS = BEGIN <> MapMap: TYPE = LONG POINTER TO MapMapObj; -- built by Include MapMapObj: TYPE = RECORD[SEQUENCE length: CARDINAL OF MapMapItem]; MapMapItem: TYPE = RECORD[old, new: RCMap.Index]; <> <> Initialize: PROC[ptr: RCMap.Base, nPages: CARDINAL, expansionOK: BOOL _ FALSE]; Finalize: PROC; <> EstablishOuter: PROC[outerProc: PROC [stb: SymbolTable.Base, mdi: Symbols.MDIndex, inner: PROC[base: SymbolTable.Base]]]; <> GetBase: PROC RETURNS[base: RCMap.Base, nWords: CARDINAL]; <> <> Acquire: PROC[stb: SymbolTable.Base, sei: Symbols.SEIndex] RETURNS[rcmx: RCMap.Index]; <> <> Include: PROC[rcmb: RCMap.Base, nWords: CARDINAL, zone: UNCOUNTED ZONE _ NIL] RETURNS[MapMap]; <> <> FindMapMapEntry: PROC[mapMap: MapMap, oldIndex: RCMap.Index] RETURNS[RCMap.Index]; Enumerate: PROC[base: RCMap.Base, nWords: CARDINAL, proc: PROC[RCMap.Index] RETURNS[stop: BOOLEAN]] RETURNS[stopped: BOOLEAN]; END. BEWARE: If you allow expansion of the RCMap Base, you must be careful about concurrent access to the existing Base. In current Cedar, for performance reasons (all accesses to the Base would have to be protected by a monitor), the Cedar runtime does not allow expansion (ERROR if RCMap Base overflows). Because it has its own RCMap.Base and is not re-entrant, the compiler (also binder) is able to specify an expansion zone (and does so) without needing a monitor.