- File:
-
- 1 edited
-
src/tests/concurrent/examples/boundedBufferEXT.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/tests/concurrent/examples/boundedBufferEXT.c
r623c16a r58caf150 1 // 1 // 2 2 // The contents of this file are covered under the licence agreement in the 3 3 // file "LICENCE" distributed with Cforall. 4 // 5 // boundedBufferEXT.c -- 6 // 4 // 5 // boundedBufferEXT.c -- 6 // 7 7 // Author : Peter A. Buhr 8 8 // Created On : Wed Apr 18 22:52:12 2018 9 9 // Last Modified By : Peter A. Buhr 10 // Last Modified On : Wed May 2 16:12:58201811 // Update Count : 712 // 10 // Last Modified On : Fri Apr 20 22:25:14 2018 11 // Update Count : 6 12 // 13 13 14 14 #include <stdlib> // random … … 22 22 enum { BufferSize = 50 }; 23 23 24 forall( otype T ) {25 monitor Buffer {26 int front, back, count;27 T elements[BufferSize];28 }; // Buffer 24 forall( otype T ) 25 monitor Buffer { 26 int front, back, count; 27 T elements[BufferSize]; 28 }; 29 29 30 void ?{}( Buffer(T) & buffer ) with( buffer ) { [front, back, count] = 0; } 30 forall( otype T ) 31 void ?{}( Buffer(T) & buffer ) with( buffer ) { [front, back, count] = 0; } 31 32 32 int query( Buffer(T) & buffer ) { return buffer.count; } // read-only, no mutual exclusion 33 forall( otype T ) 34 int query( Buffer(T) & buffer ) { return buffer.count; } 33 35 34 T remove( Buffer(T) & mutex buffer ); // forward 36 forall( otype T ) // forward 37 T remove( Buffer(T) & mutex buffer ); 35 38 36 void insert( Buffer(T) & mutex buffer, T elem ) with( buffer ) { 37 if ( count == BufferSize ) waitfor( remove, buffer ); 38 elements[back] = elem; 39 back = ( back + 1 ) % BufferSize; 40 count += 1; 41 } // insert 39 forall( otype T ) 40 void insert( Buffer(T) & mutex buffer, T elem ) with( buffer ) { 41 if ( count == BufferSize ) waitfor( remove ); 42 elements[back] = elem; 43 back = ( back + 1 ) % BufferSize; 44 count += 1; 45 } 42 46 43 T remove( Buffer(T) & mutex buffer ) with( buffer ) { 44 if ( count == 0 ) waitfor( insert, buffer ); 45 T elem = elements[front];46 front = ( front + 1 ) % BufferSize;47 count -= 1;48 return elem;49 } // remove47 forall( otype T ) 48 T remove( Buffer(T) & mutex buffer ) with( buffer ) { 49 if ( count == 0 ) waitfor( insert ); 50 T elem = elements[front]; 51 front = ( front + 1 ) % BufferSize; 52 count -= 1; 53 return elem; 50 54 } 51 55
Note:
See TracChangeset
for help on using the changeset viewer.