-- FIFOImpl.mesa -- last edited: July 13, 1981 8:27 AM DIRECTORY FIFO, FIFOConnectorBool, FIFOConnectorCard, FIFOGuardian, FIFOScheduler, WF; FIFOImpl: MONITOR IMPORTS Init: FIFOConnectorBool, ReadReq: FIFOConnectorBool, WriteReq: FIFOConnectorBool, SpaceAv: FIFOConnectorBool, DataAv: FIFOConnectorBool, DataIn: FIFOConnectorCard, DataOut: FIFOConnectorCard, FIFOGuardian, FIFOScheduler, WF EXPORTS FIFO = { -- Public -- Control logic Main: PUBLIC PROC = { p, q, r, s: PROCESS; WF.WF0["Process Main started.*n"]; -- s _ FORK FIFOGuardian.Main[]; DataIn.DataflowRequest[ComputeDataflow]; rp _ wp _ 0; ComputeDataflow[]; DO SetQuit[FALSE]; Init.GetNew[FALSE]; InitRp[]; InitWp[]; p _ FIFOScheduler.Fork[InitProc]; q _ FIFOScheduler.Fork[ReadProc]; r _ FIFOScheduler.Fork[WriteProc]; FIFOScheduler.NotifyQueue[]; [] _ JOIN p; [] _ JOIN q; [] _ JOIN r; FIFOScheduler.IncCurrent[]; ENDLOOP; FIFOScheduler.ProcessEnd[]; }; -- Private UnstableDataflow: SIGNAL = CODE; Quit: BOOLEAN; A: ARRAY [0..length) OF CARDINAL; length: CARDINAL = 1001; rp, wp: CARDINAL; -- Data flow procs. ComputeDataflow: ENTRY PROC = { Dataflow[]}; Dataflow: INTERNAL PROC = { state: RECORD [ DataAv, SpaceAv: BOOLEAN, AwpIndex, Awp, DataOut: CARDINAL]; THROUGH [1..100] DO DataAv.Stuff[state.DataAv _ (NOT ReadReq.Grab[]) AND (rp SIGNAL UnstableDataflow; ENDLOOP; }; -- Processes InitProc: PROC = { WF.WF0["InitProc started.*n"]; WF.WF1["Init halt: %u*n", FIFOScheduler.GetProcessSize[]]; Init.GetNew[TRUE]; WF.WF1["Init restart: %u*n", FIFOScheduler.GetProcessSize[]]; SetQuit[TRUE]; WF.WF0["InitProc terminated.*n"]; FIFOScheduler.ProcessEnd[]; }; ReadProc: PROC = { WF.WF0[" ReadProc started.*n"]; DO ReadReq.GetNew[FALSE]; IncRp[]; IF QuitHi[] THEN EXIT ENDLOOP; WF.WF0[" ReadProc terminated: %u.*n"]; FIFOScheduler.ProcessEnd[];}; WriteProc: PROC = { WF.WF0[" WriteProc started.*n"]; DO WriteReq.GetNew[FALSE]; IncWp[]; IF QuitHi[] THEN EXIT ENDLOOP; WF.WF0[" WriteProc terminated.*n"]; FIFOScheduler.ProcessEnd[];}; InitRp: ENTRY PROC = { rp _ 0; Dataflow[]}; InitWp: ENTRY PROC = { wp _ 0; Dataflow[]}; IncRp: ENTRY PROC = { rp _ rp + 1; Dataflow[]}; IncWp: ENTRY PROC = { wp _ wp + 1; Dataflow[]}; SetQuit: ENTRY PROC [v: BOOLEAN] = { Quit _ v}; QuitHi: ENTRY PROC RETURNS [BOOLEAN] = { RETURN[Quit]}; }. (635)\151b8B291b4B678b15B32b8B680b8B269b8B193b9B200b6B40b6B40b5B45b5B45b7B42b6B