home *** CD-ROM | disk | FTP | other *** search
- (*
- * 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.