-- Swapper>SwapTaskImpl.mesa (last edited by Forrest on April 28, 1980 11:31 AM)
-- Things to consider:
-- 1) When converting to multi-MDS, PState must be long pointer; may only free frame from same MDS as allocated it!
-- 2) Change Advance to return region, action, bufferPage, and count (or lastFlag) separately
DIRECTORY
CachedRegion: FROM "CachedRegion" USING [Desc],
Frame: FROM "Frame" USING [Alloc, Free],
PageMap: FROM "PageMap" USING [Flags],
RuntimeInternal: FROM "RuntimeInternal" USING [MakeFsi],
SwapperPrograms: FROM "SwapperPrograms",
SwapTask: FROM "SwapTask",
VM: FROM "VM" USING [Interval, PageNumber, PageCount];
SwapTaskImpl: MONITOR
IMPORTS Frame, RuntimeInternal
EXPORTS SwapperPrograms, SwapTask
SHARES SwapTask =
BEGIN OPEN SwapTask;
fsiState: CARDINAL = RuntimeInternal.MakeFsi[SIZE[State]];
swapTaskList: PState ← NIL;
Fork: PUBLIC ENTRY PROCEDURE
[swapInterval:
VM.Interval, flags: PageMap.Flags, bufferPage: VM.PageNumber, swapCount: VM.PageCount, region: CachedRegion.Desc]
RETURNS [forked: BOOLEAN] =
BEGIN
pState: PState;
IF ~(forked ← swapCount>0) THEN RETURN;
pState ← LOOPHOLE[Frame.Alloc[fsiState], PState];
pState↑ ← [swapTaskList, swapInterval, flags, bufferPage, swapCount, region];
swapTaskList ← pState;
END;
Advance: PUBLIC ENTRY PROCEDURE [interval: VM.Interval] RETURNS [state: State] =
BEGIN
pState, pStatePrev: PState;
pState ← swapTaskList;
DO OPEN pState;
--assert--IF pState=NIL THEN ERROR;
IF interval.page IN [bufferPage..bufferPage+swapInterval.count) THEN EXIT;
pStatePrev ← pState;
pState ← next;
ENDLOOP;
--assert--IF pState.countRemaining<interval.count THEN ERROR;
pState.countRemaining ← pState.countRemaining-interval.count;
state ← pState↑;
IF pState.countRemaining=0 THEN
BEGIN
IF pState=swapTaskList THEN swapTaskList ← pState.next ELSE pStatePrev.next ← pState.next;
Frame.Free[pState];
END;
END;
END.
LOG
Time: Sometime in March 1978By: McJonesAction: Created file
Time: September 5, 1978 4:39 PMBy: RedellAction: Removed ’Action’ records. Added ’swapCount’ argument and ’forked’ result to Fork.
Time: October 13, 1979 12:26 PMBy: KnutsenAction: Swap task is now a swap unit, not a region.
Time: November 26, 1979 12:20 PMBy: GobbelAction: Advance now uses count instead of doing one page at a time.
Time: April 28, 1980 11:31 AMBy: ForrestAction: FrameOps => Frame.