Changeset 9f865d1 for src/tests/boundedBuffer.c
- Timestamp:
- Oct 30, 2017, 6:22:50 PM (5 years ago)
- Branches:
- aaron-thesis, arm-eh, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, resolv-new, with_gc
- Children:
- 2ba0bc7
- Parents:
- bfc0f40
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/tests/boundedBuffer.c
rbfc0f40 r9f865d1 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 : Mon Oct 30 18:00:10 2017 11 // Update Count : 7 12 // 13 1 14 #include <stdlib> 2 15 #include <fstream> … … 6 19 7 20 monitor Buffer { 8 9 10 21 condition full, empty; 22 int front, back, count; 23 int elements[20]; 11 24 }; 12 25 13 26 void ?{}( Buffer & buffer ) { 14 27 buffer.front = buffer.back = buffer.count = 0; 15 28 } 16 29 … … 18 31 19 32 void insert( Buffer & mutex buffer, int elem ) { 20 21 22 23 24 33 if ( buffer.count == 20 ) wait( &buffer.empty ); 34 buffer.elements[buffer.back] = elem; 35 buffer.back = ( buffer.back + 1 ) % 20; 36 buffer.count += 1; 37 signal( &buffer.full ); 25 38 } 26 39 int remove( Buffer & mutex buffer ) { 27 28 29 30 31 32 40 if ( buffer.count == 0 ) wait( &buffer.full ); 41 int elem = buffer.elements[buffer.front]; 42 buffer.front = ( buffer.front + 1 ) % 20; 43 buffer.count -= 1; 44 signal( &buffer.empty ); 45 return elem; 33 46 } 34 47 35 48 thread Producer { 36 Buffer *buffer;37 49 Buffer & buffer; 50 unsigned int N; 38 51 }; 39 52 void main( Producer & prod ) { 40 41 yield( (unsigned int)rand48() % 5);42 insert( *prod.buffer, 1 );43 44 insert( *prod.buffer, -1 );53 for ( int i = 1; i <= prod.N; i += 1 ) { 54 yield( rand48( 5 ) ); 55 insert( prod.buffer, 1 ); 56 } // for 57 insert( prod.buffer, -1 ); 45 58 } 46 59 void ?{}( Producer & prod, Buffer * buffer, unsigned int N ) { 47 48 49 }60 &prod.buffer = buffer; 61 prod.N = N; 62 } 50 63 51 64 thread Consumer { 52 Buffer *buffer;53 int *sum; // summation of producer values65 Buffer & buffer; 66 int & sum; // summation of producer values 54 67 }; 55 68 void main( Consumer & cons ) { 56 *cons.sum = 0;57 58 yield( (unsigned int)rand48() % 5);59 int item = remove( *cons.buffer );60 61 *cons.sum += item;62 69 cons.sum = 0; 70 for ( ;; ) { 71 yield( rand48( 5 ) ); 72 int item = remove( cons.buffer ); 73 if ( item == -1 ) break; // sentinel ? 74 cons.sum += item; 75 } // for 63 76 } 64 77 void ?{}( Consumer & cons, Buffer * buffer, int * sum ) { 65 66 78 &cons.buffer = buffer; 79 &cons.sum = sum; 67 80 } 68 81 69 82 int main() { 70 71 72 73 74 75 76 77 83 Buffer buffer; 84 enum { Prods = 5, Cons = 5 }; 85 Producer * prods[Prods]; 86 Consumer * cons[Cons]; 87 const int Sentinel = -1; 88 int sums[Cons]; 89 int i; 90 processor p; 78 91 79 80 92 //rand48seed( getpid() ); 93 rand48seed( 1003 ); 81 94 82 83 cons[i] = new( &buffer, &sums[i] );84 85 86 prods[i] = new( &buffer, 100000u );87 95 for ( i = 0; i < Cons; i += 1 ) { // create consumers 96 cons[i] = new( &buffer, &sums[i] ); 97 } // for 98 for ( i = 0; i < Prods; i += 1 ) { // create producers 99 prods[i] = new( &buffer, 100000u ); 100 } // for 88 101 89 90 delete( prods[i] );91 92 93 insert( buffer, Sentinel );94 95 96 97 delete( cons[i] );98 sum += sums[i];99 100 102 for ( i = 0; i < Prods; i += 1 ) { // wait for producers to finish 103 delete( prods[i] ); 104 } // for 105 for ( i = 0; i < Cons; i += 1 ) { // generate sentinal values to stop consumers 106 insert( buffer, Sentinel ); 107 } // for 108 int sum = 0; 109 for ( i = 0; i < Cons; i += 1 ) { // wait for consumers to finish 110 delete( cons[i] ); 111 sum += sums[i]; 112 } // for 113 sout | "total:" | sum | endl; 101 114 } 115 116 // Local Variables: // 117 // tab-width: 4 // 118 // compile-command: "cfa boundedBuffer.c" // 119 // End: //
Note: See TracChangeset
for help on using the changeset viewer.