source: doc/papers/concurrency/examples/ProdCons.sim @ fcd65ca

ADTast-experimentalenumforall-pointer-decaypthread-emulationqualifiedEnum
Last change on this file since fcd65ca was 90b9e4b, checked in by Peter A. Buhr <pabuhr@…>, 6 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.