source: doc/papers/concurrency/examples/ProdCons.cfa @ efe89894

ast-experimental
Last change on this file since efe89894 was 1e5d0f0c, checked in by Peter A. Buhr <pabuhr@…>, 6 years ago

start rewrite of coroutine section

  • Property mode set to 100644
File size: 1.8 KB
Line 
1#include <fstream.hfa>
2#include <coroutine.hfa>
3#include <stdlib.hfa>                                                                   // random
4#include <unistd.h>                                                                             // getpid
5coroutine Cons;                                                                                 // forward
6int delivery( Cons & cons, int p1, int p2 );
7void stop( Cons & cons );
8
9coroutine Prod {
10        Cons & c;
11        int N, money, receipt;
12};
13void main( Prod & prod ) with( prod ) {                                 // starter ::main
14        // 1st resume starts here
15        for ( i; N ) {                                                                          // N pairs of values
16                int p1 = random( 100 ), p2 = random( 100 );
17                sout | p1 | " " | p2;
18                int status = delivery( c, p1, p2 );
19                sout | " $" | money | nl | status;
20                receipt += 1;
21        }
22        stop( c );
23        sout | "prod stops";
24}
25int payment( Prod & prod, int m ) with(prod) {
26        money = m;
27        resume( prod );                                                                         // main 1st time, then
28        return receipt;                                                                         // prod in delivery
29}
30void start( Prod & prod, int N, Cons &c ) {
31        &prod.c = &c;
32        prod.[N, receipt] = [N, 0];
33        resume( prod );                                                                         // activate main
34}
35coroutine Cons {
36        Prod & p;
37        int p1, p2, status;
38        bool done;
39};
40void ?{}( Cons & cons, Prod & p ) {
41        &cons.p = &p;
42        cons.[status, done ] = [0, false];
43}
44void ^?{}( Cons & cons ) {}
45void main( Cons & cons ) with( cons ) {                                 // starter prod
46        // 1st resume starts here
47        int money = 1, receipt;
48        for ( ; ! done; ) {
49                sout | p1 | " " | p2 | nl | " $" | money;
50                status += 1;
51                receipt = payment( p, money );
52                sout | " #" | receipt;
53                money += 1;
54        }
55        sout | "cons stops";
56}
57int delivery( Cons & cons, int p1, int p2 ) {
58        cons.[p1, p2] = [p1, p2];
59        resume( cons );                                                                         // main 1st time, then
60        return cons.status;                                                                     // cons in payment
61}
62void stop( Cons & cons ) {
63        cons.done = true;
64        resume( cons );                                                                         // activate payment
65}
66int main() {
67        Prod prod;
68        Cons cons = { prod };
69        srandom( getpid() );
70        start( prod, 5, cons );
71}
72
73// Local Variables: //
74// tab-width: 4 //
75// compile-command: "cfa ProdCons.cfa" //
76// End: //
Note: See TracBrowser for help on using the repository browser.