source: tests/concurrency/waituntil/channel_close.cfa@ 555c599

Last change on this file since 555c599 was c26bea2a, checked in by Peter A. Buhr <pabuhr@…>, 2 years ago

first attempt at renaming directory tests/concurrent to tests/concurrency to harmonize with other concurrency directory names

  • Property mode set to 100644
File size: 2.7 KB
Line 
1#include <select.hfa>
2#include <thread.hfa>
3#include <channel.hfa>
4#include <time.hfa>
5
6channel(long long int) A, B;
7
8volatile long long int inserts = 0;
9volatile long long int removes = 0;
10
11thread Producer {};
12void main( Producer & this ) {
13 try {
14 for( long long int i = 0;;i++ ) {
15 waituntil( (i >> A) ) { inserts++; }
16 and waituntil( (i >> B) ) { inserts++; }
17 }
18 } catch ( channel_closed * e ) {}
19}
20
21bool useAnd = false;
22thread Consumer {}; // ensures that the changing when states of Server1 don't result in a deadlock
23void main( Consumer & this ) {
24 long long int in, in2, A_removes = 0, B_removes = 0;
25 try {
26 for( ;; ) {
27 if ( useAnd ) {
28 waituntil( (in << A) ) { assert( A_removes == in ); A_removes++; removes++; }
29 and waituntil( (in2 << B) ) { assert( B_removes == in2 ); B_removes++; removes++; }
30 continue;
31 }
32 waituntil( (in << A) ) { assert( A_removes == in ); A_removes++; removes++; }
33 or waituntil( (in2 << B) ) { assert( B_removes == in2 ); B_removes++; removes++; }
34 }
35 } catchResume ( channel_closed * e ) {} // continue to remove until would block
36 catch ( channel_closed * e ) {}
37 try {
38 for( ;; )
39 waituntil( (in << A) ) { assert( A_removes == in ); A_removes++; removes++; }
40 } catchResume ( channel_closed * e ) {} // continue to remove until would block
41 catch ( channel_closed * e ) {}
42 try {
43 for( ;; )
44 waituntil( (in << B) ) { assert( B_removes == in ); B_removes++; removes++; }
45 } catchResume ( channel_closed * e ) {} // continue to remove until would block
46 catch ( channel_closed * e ) {}
47}
48
49
50size_t time = 5;
51int main( int argc, char * argv[] ) {
52 if ( argc == 2 )
53 time = atoi( argv[1] );
54
55 processor p[2];
56 A{5};
57 B{5};
58
59 printf("start OR\n");
60 {
61 Producer p;
62 Consumer c;
63 sleep(time`s);
64 printf("done sleep\n");
65 printf("closing A\n");
66 close(A);
67 printf("closing B\n");
68 close(B);
69 }
70 if ( inserts != removes )
71 printf("CHECKSUM MISMATCH!! Producer got: %lld, Consumer got: %lld\n", inserts, removes);
72 printf("done\n");
73 ^A{};
74 ^B{};
75
76 inserts = 0;
77 removes = 0;
78 A{5};
79 B{5};
80 printf("start AND\n");
81 {
82 Producer p;
83 Consumer c;
84 sleep(time`s);
85 printf("done sleep\n");
86 printf("closing A\n");
87 close(A);
88 printf("closing B\n");
89 close(B);
90 }
91 if ( inserts != removes )
92 printf("CHECKSUM MISMATCH!! Producer got: %lld, Consumer got: %lld\n", inserts, removes);
93 printf("done\n");
94}
Note: See TracBrowser for help on using the repository browser.