-- File: VMStorageMgr.mesa -- Last edited by Levin: 12-Apr-83 13:26:33 DIRECTORY AllocDefs USING [ AddSwapStrategy, RemoveSwapStrategy, SwappingProcedure, SwapStrategy, TryCodeSwapping], DynamicZone USING [CreateZone, DestroyZone, FinalizeZones, InitializeZones], SegmentDefs USING [ DataSegmentAddress, DataSegmentHandle, DataSegmentType, DefaultMDSBase, DeleteDataSegment, HardDown, InsufficientVM, MakeDataSegment, VMtoDataSegment], VMSpecial USING [PruneCache], VMStorage USING []; VMStorageMgr: PROGRAM IMPORTS AllocDefs, DynamicZone, SegmentDefs, VMSpecial EXPORTS VMStorage = BEGIN -- Types and Related Constants -- PageBuffer: TYPE = RECORD [link: PagePointer, rest: ARRAY [1..255] OF WORD]; PagePointer: TYPE = POINTER TO PageBuffer; ListState: TYPE = {stable, unstable}; -- Global Variables -- swap: AllocDefs.SwapStrategy; -- Miscellaneous Declarations -- vmMiscDS: SegmentDefs.DataSegmentType = 73B; NoMemory: ERROR [needed: CARDINAL] = CODE; -- Procedures and Variables Exported to VMStorage -- -- Node-Level Allocator -- longTerm, shortTerm: PUBLIC MDSZone; -- Page-Level Allocator -- AllocatePage: PUBLIC PROCEDURE RETURNS [POINTER] = -- allocates a single page of main memory, returning its address. BEGIN OPEN SegmentDefs; page: PagePointer; seg: DataSegmentHandle = MakeDataSegment[DefaultMDSBase, 1, HardDown ! InsufficientVM => ERROR NoMemory[needed]]; seg.type ← vmMiscDS; page ← LOOPHOLE[DataSegmentAddress[seg]]; RETURN[page] END; FreePage: PUBLIC PROCEDURE [p: POINTER] = -- releases the single page beginning at 'p'. BEGIN OPEN SegmentDefs; DeleteDataSegment[VMtoDataSegment[p]]; END; InitializeStorage: PUBLIC PROCEDURE = -- initializes the main memory allocator. BEGIN InitializePageLevel[]; InitializeNodeLevel[]; END; FinalizeStorage: PUBLIC PROCEDURE = -- finalizes the main memory allocator. BEGIN FinalizeNodeLevel[]; FinalizePageLevel[]; END; -- Internal Procedures -- -- Node-Level Allocator -- InitializeNodeLevel: PROCEDURE = BEGIN OPEN DynamicZone; InitializeZones[]; longTerm ← CreateZone[id: "VM long term"L]; shortTerm ← CreateZone[id: "VM short term"L]; END; FinalizeNodeLevel: PROCEDURE = BEGIN OPEN DynamicZone; DestroyZone[shortTerm]; DestroyZone[longTerm]; FinalizeZones[]; END; -- Page-Level Allocator -- InitializePageLevel: PROCEDURE = BEGIN swap.proc ← FlushList; AllocDefs.AddSwapStrategy[@swap]; END; FinalizePageLevel: PROCEDURE = BEGIN AllocDefs.RemoveSwapStrategy[@swap]; END; FlushList: AllocDefs.SwappingProcedure = -- try to help the swapper out. BEGIN IF AllocDefs.TryCodeSwapping[needed, info, seg] THEN RETURN[TRUE]; RETURN[VMSpecial.PruneCache[needed]] END; END.