-- FIFOGuardianImpl.mesa
-- created by Suzuki:
-- last edited by Suzuki: June 19, 1981 1:58 PM
DIRECTORY
FIFOConnectorBool,
FIFOGuardian;
FIFOGuardianImpl: MONITOR
IMPORTS
ReadReq: FIFOConnectorBool,
WriteReq: FIFOConnectorBool,
DataAv: FIFOConnectorBool,
SpaceAv: FIFOConnectorBool,
Init: FIFOConnectorBool
EXPORTS FIFOGuardian = {
NoTimeToInit: PUBLIC SIGNAL = CODE;
NoDataAv: PUBLIC SIGNAL = CODE;
NoSpaceAv: PUBLIC SIGNAL = CODE;
Main: PUBLIC PROC = {
p,q,r: PROCESS;
Initialized ← FALSE;
p ← FORK InitProc[];
q ← FORK Read[];
r ← FORK Write[];
};
Initialized: BOOLEAN;
InitProc: PROC = {
DO
Init.GetNew[TRUE];
IF ReadReq.Get[] OR
WriteReq.Get[] THEN
SIGNAL NoTimeToInit;
Initialize[];
ENDLOOP};
Read: PROC = {
DO
ReadReq.GetNew[TRUE];
IF NotInitialized[] OR Init.Get[] OR
NOT DataAv.Get[] THEN
SIGNAL NoDataAv;
ENDLOOP};
Write: PROC = {
DO
WriteReq.GetNew[TRUE];
IF NotInitialized[] OR Init.Get[] OR
NOT SpaceAv.Get[] THEN
SIGNAL NoSpaceAv;
ENDLOOP};
Initialize: ENTRY PROC = {
Initialized ← TRUE};
NotInitialized: ENTRY PROC RETURNS [BOOLEAN] = {
RETURN[~Initialized]};
}.