home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Tools / Languages / MacMETH 3.2.1 / Coroutines / CoroutinesTest.MOD < prev    next >
Encoding:
Text File  |  1994-04-15  |  2.0 KB  |  107 lines  |  [TEXT/MEDT]

  1. MODULE CoroutinesTest;
  2.  
  3.   (*
  4.         Implementation and Revisions:
  5.         ============================
  6.  
  7.         Author  Date        Description
  8.         ------  ----        -----------
  9.  
  10.         JT      7/4/94    First implementation (MacMETH_V3.2)
  11.  
  12.   *)
  13.  
  14.   FROM Terminal IMPORT
  15.     WriteString, WriteLn, Read;
  16.  
  17.   FROM Coroutines IMPORT
  18.     Coroutine,
  19.     NewCoroutine,
  20.     Transfer,
  21.     NewProcess,
  22.     Process,
  23.     ResumeProcess,
  24.     BEGINCriticalSection, ENDCriticalSection;
  25.   
  26.   VAR
  27.     main,
  28.     cID1,
  29.     cID2   : Coroutine;
  30.     pID1,
  31.     pID2   : Process;
  32.     ch     : CHAR;
  33.     p1Done,
  34.     p2Done : BOOLEAN;
  35.     
  36.   PROCEDURE C1( );
  37.     VAR
  38.       i : INTEGER;
  39.       me : Coroutine;
  40.   BEGIN
  41.     WriteString("  Coroutine 1 enables Process 1"); WriteLn;
  42.     ResumeProcess(pID1);
  43.     FOR i:= 1 TO 10 DO
  44.       WriteString("  Coroutine 1");
  45.       IF p1Done THEN
  46.         WriteString(", and Process 1 is out of the game");
  47.         p1Done := FALSE;
  48.       END(*IF*);
  49.       WriteLn;
  50.       Transfer(me, cID2);
  51.     END(*FOR*);
  52.   END C1;
  53.  
  54.   PROCEDURE C2( );
  55.     VAR
  56.       i : INTEGER;
  57.       me : Coroutine;
  58.   BEGIN
  59.     FOR i:= 1 TO 10 DO
  60.       WriteString("  Coroutine 2"); WriteLn;
  61.       Transfer(me, cID1);
  62.     END(*FOR*);
  63.   END C2;
  64.  
  65.   PROCEDURE P1();
  66.     VAR
  67.       i,j : INTEGER;
  68.   BEGIN
  69.     FOR i:= 1 TO 30000 DO
  70.       j := 1;
  71.     END(*FOR*);
  72.     BEGINCriticalSection();
  73.       p1Done := TRUE;
  74.     ENDCriticalSection();
  75.   END P1;
  76.  
  77.   PROCEDURE P2();
  78.     VAR
  79.       i,j : INTEGER;
  80.   BEGIN
  81.     FOR i:= 1 TO 30000 DO
  82.       j := 1;
  83.     END(*FOR*);
  84.     BEGINCriticalSection();
  85.       p2Done := TRUE;
  86.     ENDCriticalSection();
  87.   END P2;
  88.  
  89. BEGIN
  90.   p1Done := FALSE;
  91.   p2Done := FALSE;
  92.   NewCoroutine(C1, 4096D, cID1);
  93.   NewCoroutine(C2, 4096D, cID2);
  94.   NewProcess(P1, 4096D, pID1);
  95.   NewProcess(P2, 4096D, pID2);
  96.   WriteString("in main"); WriteLn;
  97.   Transfer(main, cID1);
  98.   WriteString("in main"); WriteLn;
  99.     IF p2Done THEN WriteString("uups"); WriteLn; END;
  100.     ResumeProcess(pID2);
  101.     REPEAT
  102.       
  103.     UNTIL p2Done;
  104.     WriteString("p2Done"); WriteLn;    
  105.   Read(ch);
  106. END CoroutinesTest.