-- 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.