t_coroutine.mod 814 B

1234567891011121314151617181920212223242526272829303132333435
  1. MODULE TCoroutine;
  2. // PIM coroutines from SYSTEM: NEWPROCESS / TRANSFER.
  3. // Two coroutines ping-pong; after 5 transfers Pong hands control
  4. // back to the main process, which checks the counter and exits 42.
  5. FROM SYSTEM IMPORT ADDRESS, PROCESS, NEWPROCESS, TRANSFER, ADR;
  6. CONST Stack = 65536;
  7. VAR ping, pong, exits : PROCESS;
  8. VAR ws1, ws2 : ARRAY [0..65535] OF CHAR;
  9. VAR count : CARDINAL;
  10. VAR ExitCode : INTEGER;
  11. PROCEDURE Ping;
  12. BEGIN
  13. LOOP
  14. TRANSFER(ping, pong)
  15. END
  16. END Ping;
  17. PROCEDURE Pong;
  18. BEGIN
  19. LOOP
  20. INC(count);
  21. IF count >= 5 THEN TRANSFER(pong, exits) END;
  22. TRANSFER(pong, ping)
  23. END
  24. END Pong;
  25. BEGIN
  26. NEWPROCESS(Ping, ADR(ws1), Stack, ping);
  27. NEWPROCESS(Pong, ADR(ws2), Stack, pong);
  28. TRANSFER(exits, ping);
  29. IF count = 5 THEN ExitCode := 42 ELSE ExitCode := 1 END
  30. END TCoroutine.