source: doc/papers/concurrency/examples/ProdCons.cfa@ 9b55aa3

Last change on this file since 9b55aa3 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.