source: src/tests/concurrent/examples/boundedBuffer.c @ a1ecdd1

ADTaaron-thesisarm-ehast-experimentalcleanup-dtorsdeferred_resndemanglerenumforall-pointer-decayjacob/cs343-translationjenkins-sandboxnew-astnew-ast-unique-exprnew-envno_listpersistent-indexerpthread-emulationqualifiedEnumresolv-newwith_gc
Last change on this file since a1ecdd1 was a1ecdd1, checked in by Peter A. Buhr <pabuhr@…>, 6 years ago

generic bounded buffer, not working

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