-- MOSSIMCharFIFODriver.sak
-- last edited by Suzuki: 14-Dec-81 10:26:38 

DIRECTORY
  MOSSIMFIFO: TYPE, 
  Connector: TYPE, 
  SimIO: TYPE;

MOSSIMCharFIFODriver: MONITOR
  IMPORTS Connector, MOSSIMFIFO, SimIO
  
  = BEGIN
  Reader: PROC
       [DataAv: Connector.Handle, DataOut: Connector.Handle, Done: Connector.Handle, 
        ReadReq: Connector.Handle] = {
    criticalSection3: ENTRY PROC = {
      Connector.Put[ReadReq, NEW[BOOLEAN ← TRUE]]};
    SimIO.WF0["  Reader started.*n"]; 
    THROUGH [0..30) DO
        Connector.GetNew[Done, TRUE]; criticalSection3[]; 
        FOR i: NAT IN [0..16) DO
            SimIO.WF1
              ["%u", 
               NARROW[Connector.Get[DataOut], REF ARRAY INTEGER [0..16) OF CHARACTER]↑[i]]
            ENDLOOP; 
        SimIO.WF0["  "]; 
        Connector.Put[ReadReq, NEW[BOOLEAN ← FALSE]]
        ENDLOOP; 
    SimIO.WF0["  Reader terminated.*n"]; 
    Connector.ProcessEnd[]}; 
  
  Writer: PROC [SpaceAv, Done: Connector.Handle, 
                WriteReq: Connector.Handle, 
                DataIn: Connector.Handle] = {
    i: CARDINAL; 
    criticalSection4: ENTRY PROC = {
      {Connector.Put[DataIn, NEW[CARDINAL ← i]]; 
       Connector.Put[WriteReq, NEW[BOOLEAN ← TRUE]]}};
    SimIO.WF0[" Writer started.*n"]; 
    FOR i IN [0..30) DO
        Connector.GetNew[Done, TRUE]; criticalSection4[]; 
        SimIO.WF1["%u-  ", i]; 
        Connector.Put[WriteReq, NEW[BOOLEAN ← FALSE]]
        ENDLOOP; 
    SimIO.WF0[" Writer terminated.*n"]; 
    Connector.ProcessEnd[]}; 
  
  Start: PROC [Init, ReadReq, WriteReq, DataIn: Connector.Handle] = {
    Connector.Put[ReadReq, NEW[BOOLEAN ← FALSE]]; 
    Connector.Put[WriteReq, NEW[BOOLEAN ← FALSE]]; 
    Connector.Put[DataIn, NEW[CARDINAL ← 0]];
    Connector.Delay[10]; 
    Connector.Put[Init, NEW[BOOLEAN ← TRUE]]; 
    Connector.Delay[5]; 
    Connector.Put[Init, NEW[BOOLEAN ← FALSE]]; 
    Connector.ProcessEnd[]};
  
  SimIO.Start["FIFO.jam"]; 
  {init: Connector.Handle ← Connector.Create[]; 
   write: Connector.Handle ← Connector.Create[]; 
   read: Connector.Handle ← Connector.Create[]; 
   in: Connector.Handle ← Connector.Create[]; 
   space: Connector.Handle ← Connector.Create[]; 
   data: Connector.Handle ← Connector.Create[]; 
   out: Connector.Handle ← Connector.Create[]; 
   done: Connector.Handle ← Connector.Create[]; 
   fifo, reader, writer, start: PROCESS;
   Connector.IncCurrent[]; 
   fifo ← FORK MOSSIMFIFO.FIFOFunc[size: 100, 
                                            Init: init, 
                                            WriteRequest: write, 
                                            ReadRequest: read, 
                                            DIn: in, 
                                            SpaceAv: space, 
                                            DataAv: data, 
                                            DOut: out, 
                                            Done: done]; 
   Connector.IncCurrent[]; 
   reader ← FORK Reader[DataAv: data, DataOut: out, ReadReq: read, Done: 
                                 done]; 
   Connector.IncCurrent[]; 
   writer ← FORK Writer[SpaceAv: space, Done: done, WriteReq: write, DataIn: 
                                 in]; 
   Connector.IncCurrent[]; 
   start ← FORK Start[Init: init, ReadReq: read, WriteReq: write, DataIn: in]; 
   [] ← JOIN fifo; [] ← JOIN reader; [] ← JOIN writer; [] ← JOIN start}; 
  SimIO.Stop[]
  END.