-- RTSponge.Mesa
-- last edited December 6, 1982 12:42 pm by Paul Rovner

DIRECTORY
Process USING[Priority],
ProcessPriorities USING[priorityPageFaultHigh];

RTSponge: DEFINITIONS LOCKS Lock


= BEGIN

Lock: MONITORLOCK;
SpongeNeeded: CONDITION;
SpongeRunning: CONDITION;
SpongeFinished: CONDITION;
SpongeEnabled: CONDITION;

spongePriority: Process.Priority = ProcessPriorities.priorityPageFaultHigh;

useCount: CARDINAL;
spongeRunning: BOOLEAN;
spongeDisabled: BOOLEAN;

StartSponge: ENTRY PROC = INLINE
{WHILE spongeDisabled DO WAIT SpongeEnabled ENDLOOP;
useCount ← useCount + 1;
IF useCount = 1 THEN NOTIFY SpongeNeeded;
UNTIL spongeRunning DO WAIT SpongeRunning; ENDLOOP};

StopSponge: ENTRY PROC = INLINE
{IF useCount = 0 THEN ERROR;
useCount ← useCount - 1;
IF useCount = 0 THEN NOTIFY SpongeFinished};

-- used by the checkpointproc
Disable: ENTRY PROC = INLINE
{UNTIL useCount = 0 DO WAIT SpongeFinished ENDLOOP;
spongeDisabled ← TRUE};

-- used by the checkpointproc
Enable: ENTRY PROC = INLINE
{IF NOT spongeDisabled THEN ERROR;
spongeDisabled ← FALSE;
BROADCAST SpongeEnabled};

END.