<> <> <> <> <<>> <> DIRECTORY PrincOps USING[SD], RTSD USING[sMapStiStd], RTSymbolDefs USING[nullHandle], RTTypesBasicPrivate USING[InitialSTIRangeSize, LOOPHOLEDTMapStiStd, MapStiStd, RMapStiStd, RSTDesc, STDesc, SymbolTableIndex], SafeStorage USING[TypeIndex], UnsafeStorage USING[GetSystemUZone]; SymbolAccessImpl: MONITOR -- protects MapStiStd IMPORTS RTTypesBasicPrivate, UnsafeStorage EXPORTS RTTypesBasicPrivate = BEGIN OPEN RTTypesBasicPrivate, RTTypesBasicPrivate, SafeStorage; lastSTIndex: TypeIndex _ 0; TooManyTypes: ERROR = CODE; BlessMapStiStd: PUBLIC ENTRY PROC = { ENABLE UNWIND => NULL; t: LOOPHOLEDTMapStiStd = LOOPHOLE[RTTypesBasicPrivate.MapStiStd]; LOOPHOLE[RTTypesBasicPrivate.MapStiStd, LOOPHOLEDTMapStiStd] _ NIL; RTTypesBasicPrivate.MapStiStd _ NEW[RMapStiStd[InitialSTIRangeSize]]; FOR i: SymbolTableIndex IN [1..lastSTIndex] DO RTTypesBasicPrivate.MapStiStd[i] _ NEW[STDesc _ t[i]^] ENDLOOP; LOOPHOLE[LONG[@PrincOps.SD[RTSD.sMapStiStd]], LONG POINTER TO LONG POINTER]^ _ LOOPHOLE[RTTypesBasicPrivate.MapStiStd, LONG POINTER]; }; FindSTI: PUBLIC ENTRY PROC [std: STDesc, initializing: BOOL] RETURNS[i: SymbolTableIndex] = { ENABLE UNWIND => NULL; FOR i DECREASING IN [1..lastSTIndex] DO desc: RTTypesBasicPrivate.STDesc _ RTTypesBasicPrivate.MapStiStd[i]^; IF std.symbolsStamp.time # desc.symbolsStamp.time THEN LOOP; IF std.symbolsStamp.host # desc.symbolsStamp.host THEN LOOP; IF std.symbolsStamp.net # desc.symbolsStamp.net THEN LOOP; IF std.bcd # NIL AND std.sgi # desc.sgi THEN LOOP; IF desc.sth = RTSymbolDefs.nullHandle THEN { IF initializing THEN LOOPHOLE[RTTypesBasicPrivate.MapStiStd, LOOPHOLEDTMapStiStd][i].sth _ std.sth ELSE RTTypesBasicPrivate.MapStiStd[i].sth _ std.sth; }; RETURN[i]; ENDLOOP; IF lastSTIndex = InitialSTIRangeSize - 1 THEN ERROR TooManyTypes; i _ lastSTIndex _ lastSTIndex + 1; IF initializing THEN LOOPHOLE[RTTypesBasicPrivate.MapStiStd, LOOPHOLEDTMapStiStd][i] _ UnsafeStorage.GetSystemUZone[].NEW[STDesc _ std] ELSE RTTypesBasicPrivate.MapStiStd[i] _ NEW[STDesc _ std]; }; END.