(* * Producer/Consumer Test Module * * This module tests the WAIT and SEND functions * found in the Processes module and is adapted * from code found on page 346 of Advanced Modula-2 * by Herber Schildt available from McGraw-Hill. * *) MODULE ProCon; FROM Terminal IMPORT WriteLn,WriteString; FROM SYSTEM IMPORT WORD,PROCESS,ADR,NEWPROCESS,TRANSFER; FROM Processes IMPORT WAIT,SEND,StartProcess,Init,SIGNAL; VAR buf: ARRAY[0..100] OF CHAR; S: SIGNAL; PROCEDURE Consumer; BEGIN LOOP WriteString("waiting"); (* This portion of the loop is *) WriteLn; (* executed only once !!! *) WAIT(S); (* Wait for characters from buffer *) WriteLn; (* Subsequent SEND's cause looping on the *) WriteString(buf); (* WAIT rather than going to the statement *) END; (* after the LOOP? is it a bug or the way its *) END Consumer; (* supposed to work? *) PROCEDURE Producer; VAR count: CARDINAL; ch: CHAR; BEGIN count := 0; LOOP READ(ch); (* Clear character buffer *) IF (ch <> CHR(13)) AND (count < 99) THEN buf[count] := ch; WRITE(ch); INC(count); ELSE buf[count] := CHR(0); (* Null terminator *) count := 0; SEND(S); END; END; END Producer; BEGIN Init(S); StartProcess(Consumer,1000); Producer; END ProCon.