RCMapOps.mesa
Last Modified By Paul Rovner On September 19, 1983 9:31 pm
DIRECTORY
RCMap: TYPE USING[Base, Index],
SymbolTable: TYPE USING[Base],
Symbols: TYPE USING[SEIndex, MDIndex];
RCMapOps: DEFINITIONS
= BEGIN
TYPEs
MapMap: TYPE = LONG POINTER TO MapMapObj; -- built by Include
MapMapObj: TYPE = RECORD[SEQUENCE length: CARDINAL OF MapMapItem];
MapMapItem: TYPE = RECORD[old, new: RCMap.Index];
Establish the specified Base as the "current" one.
ASSUME ptr was allocated by VM.Allocate
Initialize: PROC[ptr: RCMap.Base, nPages: CARDINAL, expansionOK: BOOLFALSE];
Finalize: PROC;
Establish an Outer proc
EstablishOuter: PROC[outerProc: PROC [stb: SymbolTable.Base,
mdi: Symbols.MDIndex,
inner: PROC[base: SymbolTable.Base]]];
Retrieve info about the current RCMap.Base
GetBase: PROC RETURNS[base: RCMap.Base, nWords: CARDINAL];
Returns an RCMap.Index in the current RCMap.Base of the RCMap for the specified type.
Makes an entry if necessary.
Acquire: PROC[stb: SymbolTable.Base, sei: Symbols.SEIndex] RETURNS[rcmx: RCMap.Index];
Merges the specified RCMap.Base into the current one.
If zone # NIL, allocates and returns a MapMap
Include: PROC[rcmb: RCMap.Base, nWords: CARDINAL, zone: UNCOUNTED ZONENIL] RETURNS[MapMap];
Does a MapMap lookup: returns the index in the current RCMap.Base that corresponds
to the specified index in the RCMap.Base that Include processed.
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.