source: tests/concurrency/examples/boundedBufferINT.cfa @ 6a6e205

Last change on this file since 6a6e205 was 10b5970, checked in by Michael Brooks <mlbrooks@…>, 2 weeks ago

Fix many test-suite- and libcfa-caused unused variable warnings.

In scope are easy fixes among tests whose sole warnings were unused variable. Reduces the wflags lax list by 40%.

  • Property mode set to 100644
File size: 2.9 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2017 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
7// boundedBuffer.c --
8//
9// Author           : Peter A. Buhr
10// Created On       : Mon Oct 30 12:45:13 2017
11// Last Modified By : Peter A. Buhr
12// Last Modified On : Fri Jun 21 08:20:46 2019
13// Update Count     : 90
14//
15
16#include <stdlib.hfa>                                                                   // random
17#include <fstream.hfa>
18#include <kernel.hfa>
19#include <thread.hfa>
20#include <unistd.h>                                                                             // getpid
21
22//Duration default_preemption() { return 0; }
23
24enum { BufferSize = 50 };
25
26forall( T ) {
27        monitor Buffer {
28                condition full, empty;
29                int front, back, count;
30                T elements[BufferSize];
31        }; // Buffer
32
33        void ?{}( Buffer(T) & buffer ) with( buffer ) { [front, back, count] = 0; }
34
35        int query( Buffer(T) & buffer ) { return buffer.count; } // read-only, no mutual exclusion
36
37        void insert( Buffer(T) & mutex buffer, T elem ) with( buffer ) {
38                if ( count == BufferSize ) wait( empty );
39                elements[back] = elem;
40                back = ( back + 1 ) % BufferSize;
41                count += 1;
42                signal( full );
43        } // insert
44
45        T remove( Buffer(T) & mutex buffer ) with( buffer ) {
46                if ( count == 0 ) wait( full );
47                T elem = elements[front];
48                front = ( front + 1 ) % BufferSize;
49                count -= 1;
50                signal( empty );
51                return elem;
52        } // remove
53}
54
55enum { Sentinel = -1 };
56
57thread Producer {
58        Buffer(int) & buffer;
59        unsigned int N;
60};
61void main( Producer & prod ) with( prod ) {
62        for ( i; 1 ~= N ) {
63                yield( random( 5 ) );
64                insert( buffer, 1 );
65        } // for
66}
67void ?{}( Producer & prod, Buffer(int) * buffer, int N ) {
68        &prod.buffer = buffer;
69        prod.N = N;
70}
71
72thread Consumer {
73        Buffer(int) & buffer;
74        int & sum;                                                                                      // summation of producer values
75};
76void main( Consumer & cons ) with( cons ) {
77        sum = 0;
78        for () {
79                yield( random( 5 ) );
80                int item = remove( buffer );
81          if ( item == Sentinel ) break;                                        // sentinel ?
82                sum += item;
83        } // for
84}
85void ?{}( Consumer & cons, Buffer(int) * buffer, int & sum ) {
86        &cons.buffer = buffer;
87        &cons.sum = &sum;
88}
89
90int main() {
91        Buffer(int) buffer;
92        enum { Prods = 4, Cons = 5 };
93        Producer * prods[Prods];
94        Consumer * cons[Cons];
95        int sums[Cons];
96        processor p;
97
98        //srandom( getpid() );
99        srandom( 1003 );
100
101        for ( i; Cons ) {                                                                       // create consumers
102                cons[i] = new( &buffer, sums[i] );
103        } // for
104        for ( i; Prods ) {                                                                      // create producers
105                prods[i] = new( &buffer, 100000 );
106        } // for
107
108        for ( i; Prods ) {                                                                      // wait for producers to finish
109                delete( prods[i] );
110        } // for
111        for ( i; Cons ) {                                                                       // generate sentinal values to stop consumers
112                insert( buffer, Sentinel );
113        } // for
114        int sum = 0;
115        for ( i; Cons ) {                                                                       // wait for consumers to finish
116                delete( cons[i] );
117                sum += sums[i];
118        } // for
119        sout | "total:" | sum;
120}
121
122// Local Variables: //
123// tab-width: 4 //
124// compile-command: "cfa boundedBufferINT.cfa" //
125// End: //
Note: See TracBrowser for help on using the repository browser.