-- NewFIFODriver.sak -- last edited by Suzuki: 28-Nov-81 22:45:19 DIRECTORY FIFO: TYPE, SakuraRT: TYPE, SimIO: TYPE; NewFIFODriver: MONITOR IMPORTS FIFO, SakuraRT, SimIO = BEGIN Reader: PROC [DataAv: SakuraRT.Handle, DataOut: SakuraRT.Handle, ReadReq: SakuraRT.Handle] = { data: CARDINAL; {ENABLE {ABORTED => GO TO Aborted}; SimIO.WF0[" Reader started.*n"]; THROUGH [0..30) DO SakuraRT.Delay[20]; WHILE NOT (SakuraRT.GetBool[DataAv] = TRUE) DO SakuraRT.StandardDelay[] ENDLOOP; SakuraRT.Put[ReadReq, NEW[BOOLEAN ← TRUE]]; data ← SakuraRT.GetCard[DataOut]; SimIO.WF1["%u ", @data]; SakuraRT.Delay[10]; SakuraRT.Put[ReadReq, NEW[BOOLEAN ← FALSE]] ENDLOOP; SimIO.WF0[" Reader terminated.*n"]; SakuraRT.ProcessEnd[]} EXITS Aborted => SakuraRT.Abort[]}; Writer: PROC [SpaceAv: SakuraRT.Handle, WriteReq: SakuraRT.Handle, DataIn: SakuraRT.Handle] = { i: CARDINAL; {ENABLE {ABORTED => GO TO Aborted}; SimIO.WF0[" Writer started.*n"]; FOR i IN [0..30) DO SakuraRT.Delay[20]; WHILE NOT (SakuraRT.GetBool[SpaceAv] = TRUE) DO SakuraRT.StandardDelay[] ENDLOOP; SakuraRT.Put[DataIn, NEW[CARDINAL ← i]]; SakuraRT.Put[WriteReq, NEW[BOOLEAN ← TRUE]]; SimIO.WF1["%u- ", @i]; SakuraRT.Delay[10]; SakuraRT.Put[WriteReq, NEW[BOOLEAN ← FALSE]] ENDLOOP; SimIO.WF0[" Writer terminated.*n"]; SakuraRT.ProcessEnd[]} EXITS Aborted => SakuraRT.Abort[]}; Start: PROC [Init, ReadReq, WriteReq: SakuraRT.Handle] = { {ENABLE {ABORTED => GO TO Aborted}; SakuraRT.Put[ReadReq, NEW[BOOLEAN ← FALSE]]; SakuraRT.Put[WriteReq, NEW[BOOLEAN ← FALSE]]; SakuraRT.Delay[10]; SakuraRT.Put[Init, NEW[BOOLEAN ← TRUE]]; SakuraRT.Delay[5]; SakuraRT.Put[Init, NEW[BOOLEAN ← FALSE]]; SakuraRT.ProcessEnd[]} EXITS Aborted => SakuraRT.Abort[]}; SimIO.Start[]; {init: SakuraRT.Handle ← SakuraRT.Create[]; write: SakuraRT.Handle ← SakuraRT.Create[]; read: SakuraRT.Handle ← SakuraRT.Create[]; in: SakuraRT.Handle ← SakuraRT.Create[]; space: SakuraRT.Handle ← SakuraRT.Create[]; data: SakuraRT.Handle ← SakuraRT.Create[]; out: SakuraRT.Handle ← SakuraRT.Create[]; fifo, reader, writer, start: PROCESS; SakuraRT.IncCurrent[]; fifo ← FORK FIFO.FIFOFunc[size: 100, Init: init, WriteRequest: write, ReadRequest: read, DIn: in, SpaceAv: space, DataAv: data, DOut: out];SakuraRT.CatalogProcId[fifo]; SakuraRT.IncCurrent[]; reader ← FORK Reader[DataAv: data, DataOut: out, ReadReq: read]; SakuraRT.CatalogProcId[reader]; SakuraRT.IncCurrent[]; writer ← FORK Writer[SpaceAv: space, WriteReq: write, DataIn: in]; SakuraRT.CatalogProcId[writer]; SakuraRT.IncCurrent[]; start ← FORK Start[Init: init, ReadReq: read, WriteReq: write]; SakuraRT.CatalogProcId[start]; SakuraRT.DecCurrent[]; SakuraRT.Join[fifo]; SakuraRT.Join[reader]; SakuraRT.Join[writer]; SakuraRT.Join[start]; SakuraRT.IncCurrent[]}; SimIO.Stop[] END.