source: src/tests/concurrent/examples/boundedBuffer.c@ 59073fd

ADT aaron-thesis arm-eh ast-experimental cleanup-dtors deferred_resn demangler enum forall-pointer-decay jacob/cs343-translation jenkins-sandbox new-ast new-ast-unique-expr new-env no_list persistent-indexer pthread-emulation qualifiedEnum resolv-new with_gc
Last change on this file since 59073fd was a1ecdd1, checked in by Peter A. Buhr <pabuhr@…>, 8 years ago

generic bounded buffer, not working

  • Property mode set to 100644
File size: 2.8 KB
RevLine 
[4cedd9f]1//
[9f865d1]2// The contents of this file are covered under the licence agreement in the
3// file "LICENCE" distributed with Cforall.
[4cedd9f]4//
5// boundedBuffer.c --
6//
[9f865d1]7// Author : Peter A. Buhr
8// Created On : Mon Oct 30 12:45:13 2017
9// Last Modified By : Peter A. Buhr
[a1ecdd1]10// Last Modified On : Wed Dec 13 21:01:49 2017
11// Update Count : 27
[4cedd9f]12//
[9f865d1]13
[1033f5d]14#include <stdlib>
[6c7b1e7]15#include <fstream> // random
[1033f5d]16#include <kernel>
17#include <thread>
[6c7b1e7]18#include <unistd.h> // getpid
[1033f5d]19
[a1ecdd1]20forall( otype T )
[1033f5d]21monitor Buffer {
[9f865d1]22 condition full, empty;
23 int front, back, count;
[a1ecdd1]24 T elements[20];
[1033f5d]25};
26
[a1ecdd1]27forall( otype T )
28void ?{}( Buffer(T) & buffer ) {
[9f865d1]29 buffer.front = buffer.back = buffer.count = 0;
[1033f5d]30}
31
[a1ecdd1]32forall( otype T )
33int query( Buffer(T) & buffer ) { return buffer.count; }
[1033f5d]34
[a1ecdd1]35forall( otype T )
36void insert( Buffer(T) & mutex buffer, T elem ) with( buffer ) {
[971d9f2]37 if ( count == 20 ) wait( empty );
38 elements[back] = elem;
39 back = ( back + 1 ) % 20;
40 count += 1;
41 signal( full );
[1033f5d]42}
[a1ecdd1]43
44forall( otype T )
45T remove( Buffer(T) & mutex buffer ) with( buffer ) {
[971d9f2]46 if ( count == 0 ) wait( full );
[a1ecdd1]47 T elem = elements[front];
[971d9f2]48 front = ( front + 1 ) % 20;
49 count -= 1;
50 signal( empty );
[9f865d1]51 return elem;
[1033f5d]52}
53
54thread Producer {
[a1ecdd1]55 Buffer(int) & buffer;
[9f865d1]56 unsigned int N;
[1033f5d]57};
58void main( Producer & prod ) {
[9f865d1]59 for ( int i = 1; i <= prod.N; i += 1 ) {
[6c7b1e7]60 yield( random( 5 ) );
[9f865d1]61 insert( prod.buffer, 1 );
62 } // for
63 insert( prod.buffer, -1 );
[1033f5d]64}
[a1ecdd1]65void ?{}( Producer & prod, Buffer(int) * buffer, unsigned int N ) {
[9f865d1]66 &prod.buffer = buffer;
67 prod.N = N;
[a1ecdd1]68}
[1033f5d]69
70thread Consumer {
[a1ecdd1]71 Buffer(int) & buffer;
[9f865d1]72 int & sum; // summation of producer values
[1033f5d]73};
74void main( Consumer & cons ) {
[9f865d1]75 cons.sum = 0;
76 for ( ;; ) {
[6c7b1e7]77 yield( random( 5 ) );
[9f865d1]78 int item = remove( cons.buffer );
79 if ( item == -1 ) break; // sentinel ?
80 cons.sum += item;
81 } // for
[1033f5d]82}
[a1ecdd1]83void ?{}( Consumer & cons, Buffer(int) * buffer, int * sum ) {
[9f865d1]84 &cons.buffer = buffer;
85 &cons.sum = sum;
[1033f5d]86}
87
88int main() {
[a1ecdd1]89 Buffer(int) buffer;
[9f865d1]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;
[1033f5d]97
[6c7b1e7]98 //random_seed( getpid() );
99 random_seed( 1003 );
[1033f5d]100
[9f865d1]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
[1033f5d]107
[9f865d1]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;
[1033f5d]120}
[9f865d1]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.