-- FIFOConnectorBoolImpl.mesa -- last edited July 13, 1981 8:26 AM DIRECTORY Envelopes, FIFOConnectorBool, FIFOScheduler, Process, WF; FIFOConnectorBoolImpl: MONITOR IMPORTS FIFOScheduler, Process, WF EXPORTS FIFOConnectorBool = { OPEN Envelopes; New: CONDITION; value: BOOLEAN; length: CARDINAL = 6; index: CARDINAL _ 0; queue: ARRAY [0..length) OF Envelope; Put: PUBLIC PROC [v: BOOLEAN] = { -- WF.WF1["Put S:%b ", v]; StuffIt[v]; FIFOScheduler.StandardDelay[]; Process.Yield[]; -- WF.WF0["Put F "] }; Stuff: PUBLIC PROC [v: BOOLEAN] = { -- WF.WF1[" Stuff S:%b ", v]; StuffIt[v]; Process.Yield[]; -- WF.WF0[" Stuff F "] }; StuffIt: ENTRY PROC [v: BOOLEAN] = { e: Envelope; value _ v; BROADCAST New; WHILE ~EmptyQueue[] DO e _ FirstOfQueue[]; e.value _ value; NOTIFY e.cond^; ENDLOOP}; Get: PUBLIC PROC RETURNS [ret: BOOLEAN] = { ret _ GrabIt[]; FIFOScheduler.StandardDelay[]}; Grab: PUBLIC ENTRY PROC RETURNS [ret: BOOLEAN] = { -- WF.WF0[" Grab S"]; ret _ value; -- WF.WF0[" Grab F "] }; GrabIt: ENTRY PROC RETURNS[BOOLEAN] = { RETURN[value]}; GetNew: PUBLIC PROC [v: BOOLEAN] = { -- WF.WF1[" GetNew S:%b ", v]; GetNewBody[v]; FIFOScheduler.StandardDelay[]; -- WF.WF0[" GetNew F"] }; GetNewBody: ENTRY PROC [v: BOOLEAN] = { FIFOScheduler.NotifyQueue[]; DO WAIT New; IF v=value THEN EXIT; ENDLOOP; FIFOScheduler.IncCurrent[]; }; RequestNew: PUBLIC PROC [e:Envelope] = { FIFOScheduler.StandardDelay[]; PutOnQueue[e]}; EmptyQueue: PROC RETURNS [BOOLEAN] = { RETURN[index=0]}; FirstOfQueue: PROC RETURNS [v: Envelope] = { v _ queue[index]; index _ index+1}; PutOnQueue: ENTRY PROC [v: Envelope] = { IF index>=length THEN ERROR; queue[index_ index+1] _ v}; Process.DisableTimeout[@New]; }.