-- ZoneIndicesImpl.Mesa -- last edited May 20, 1982 1:05 pm by Paul Rovner DIRECTORY RTTypesBasic USING[Type], RTOS USING[PermanentPageZone], RTRefCounts USING[StuffMapSziSz], RTZones; ZoneIndicesImpl: MONITOR -- protects ziNext and sziNext IMPORTS RTOS, RTRefCounts, RTZones EXPORTS RTZones = BEGIN OPEN RTZones; -- Types Type: TYPE = RTTypesBasic.Type; -- Errors TooManyZones: PUBLIC ERROR = CODE; -- Global variable ziNext: ZoneIndex; sziNext: SubZoneIndex ← 1; nZiMax: ZoneIndex ← nZiMaxInit; nSziMax: SubZoneIndex ← nSziMaxInit; MapSziSz: PUBLIC TMapSziSz; -- PUBLIC procedures GetZiNext: PUBLIC ENTRY PROCEDURE RETURNS[zi: ZoneIndex] = { RETURN[ziNext]}; GetSZiNext: PUBLIC ENTRY PROCEDURE RETURNS[szi: SubZoneIndex] = { RETURN[sziNext]}; GetnZiMax: PUBLIC ENTRY PROCEDURE RETURNS[zi: ZoneIndex] = { RETURN[nZiMax]}; GetnSziMax: PUBLIC ENTRY PROCEDURE RETURNS[szi: SubZoneIndex] = { RETURN[nSziMax]}; AssignSz: PUBLIC ENTRY PROCEDURE[szi: SubZoneIndex, sz: SubZone] = { MapSziSz[szi] ← sz}; -- called by AllocZoneImpl from its START code. SetZiNext: PUBLIC ENTRY PROCEDURE[zi: ZoneIndex] = { ziNext ← zi}; AllocateZi: PUBLIC ENTRY PROCEDURE RETURNS[zi: ZoneIndex] = BEGIN ENABLE UNWIND => NULL; IF ziNext = nZiMax THEN { FOR zi IN [1..nZiMax] DO IF MapZiZn[zi] = NIL THEN RETURN[zi] ENDLOOP; ERROR TooManyZones}; zi ← ziNext; ziNext ← ziNext+1; END; AllocateSzi: PUBLIC ENTRY PROCEDURE RETURNS[szi: SubZoneIndex] = BEGIN ENABLE UNWIND => NULL; IF sziNext = nSziMax THEN { FOR szi IN [1..nSziMax] DO IF MapSziSz[szi] = NIL THEN RETURN[szi] ENDLOOP; ERROR TooManyZones}; szi ← sziNext; sziNext ← sziNext+1; END; -- START code MapSziSz ← RTOS.PermanentPageZone.NEW[RMapSziSz[nSziMaxInit]]; RTRefCounts.StuffMapSziSz[MapSziSz]; END.