MODULE TCoroutine; // PIM coroutines from SYSTEM: NEWPROCESS / TRANSFER. // Two coroutines ping-pong; after 5 transfers Pong hands control // back to the main process, which checks the counter and exits 42. FROM SYSTEM IMPORT ADDRESS, PROCESS, NEWPROCESS, TRANSFER, ADR; CONST Stack = 65536; VAR ping, pong, exits : PROCESS; VAR ws1, ws2 : ARRAY [0..65535] OF CHAR; VAR count : CARDINAL; VAR ExitCode : INTEGER; PROCEDURE Ping; BEGIN LOOP TRANSFER(ping, pong) END END Ping; PROCEDURE Pong; BEGIN LOOP INC(count); IF count >= 5 THEN TRANSFER(pong, exits) END; TRANSFER(pong, ping) END END Pong; BEGIN NEWPROCESS(Ping, ADR(ws1), Stack, ping); NEWPROCESS(Pong, ADR(ws2), Stack, pong); TRANSFER(exits, ping); IF count = 5 THEN ExitCode := 42 ELSE ExitCode := 1 END END TCoroutine.