source: doc/papers/concurrency/examples/ProdCons.sim@ 314c9d8

Last change on this file since 314c9d8 was 90b9e4b, checked in by Peter A. Buhr <pabuhr@…>, 7 years ago

add Simila, Python and uC++ example coroutines

  • Property mode set to 100644
File size: 2.2 KB
Line 
1BEGIN
2 CLASS Consumer( prod );
3 REF(Producer) prod; ! constructor parameter;
4 HIDDEN p1, p2, status, done, Main;
5 BEGIN
6 INTEGER p1, p2, status;
7 BOOLEAN done;
8 PROCEDURE main;
9 BEGIN
10 INTEGER money, receipt;
11
12 money := 1;
13 WHILE NOT done DO BEGIN
14 OutText( "cons receives: " );
15 OutInt( p1, 3 );
16 OutText( ", " );
17 OutInt( p2, 3 );
18 status := status + 1;
19 OutText( " and pays $" );
20 OutInt( money, 3 ); OutImage;
21 receipt := prod.payment( money );
22 OutText( "cons receipt #" );
23 OutInt( receipt, 3 ); OutImage;
24 money := money + 1;
25 END;
26 OutText( "cons stops" ); OutImage;
27 END;
28 INTEGER PROCEDURE delivery( p1p, p2p );
29 INTEGER p1p, p2p;
30 BEGIN
31 p1 := p1p;
32 p2 := p2p;
33 Resume( THIS Consumer );
34 delivery := status;
35 END;
36 PROCEDURE stop;
37 BEGIN
38 done := TRUE;
39 Call( THIS Consumer );
40 END;
41 ! Consumer constructor code;
42 status := 0;
43 done := FALSE;
44 Detach;
45 main;
46 END Consumer;
47
48 CLASS Producer;
49 HIDDEN cons, N, money, receipt, Main;
50 BEGIN
51 REF(Consumer) cons;
52 INTEGER N, money, receipt;
53 PROCEDURE main;
54 BEGIN
55 INTEGER i, p1, p2, status;
56
57 FOR i := 1 STEP 1 UNTIL N DO BEGIN
58 p1 := RandInt( 1, 100, p1 );
59 p2 := RandInt( 1, 100, p2 );
60 OutText( "prod delivers: " );
61 OutInt( p1, 3 ); OutText( ", " );
62 OutInt( p2, 3 ); OutImage;
63 status := cons.delivery( p1, p2 );
64 OutText( "prod status: " );
65 OutInt( status, 3 ); OutImage;
66 END;
67 cons.stop;
68 OutText( "prod stops" ); OutImage;
69 END;
70 INTEGER PROCEDURE payment( moneyp );
71 INTEGER moneyp;
72 BEGIN
73 money := moneyp;
74 OutText( "prod payment of $" );
75 OutInt( money, 3 ); OutImage;
76 Resume( THIS Producer );
77 receipt := receipt + 1;
78 payment := receipt;
79 END;
80 PROCEDURE start( Np, consp );
81 INTEGER Np;
82 REF(Consumer) consp;
83 BEGIN
84 N := Np;
85 cons :- consp;
86 Resume( THIS Producer );
87 END;
88 ! Producer constructor code;
89 receipt := 0;
90 Detach;
91 main;
92 END Producer;
93 ! program main equivalent;
94 REF(Producer) prod;
95 REF(Consumer) cons;
96 prod :- NEW Producer;
97 cons :- NEW Consumer( prod );
98 prod.start( 5, cons );
99END;
100
101! Local Variables: ;
102! tab-width: 4 ;
103! compile-command: "cim ProdCons.sim" ;
104! End: ;
Note: See TracBrowser for help on using the repository browser.