source: src/tests/boundedBuffer.c @ 1033f5d

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 1033f5d was 1033f5d, checked in by Peter A. Buhr <pabuhr@…>, 7 years ago

add monitor bounded-buffer test

  • Property mode set to 100644
File size: 2.6 KB
RevLine 
[1033f5d]1#include <stdlib>
2#include <fstream>
3#include <kernel>
4#include <thread>
5#include <unistd.h>                                     // getpid
6
7monitor Buffer {
8    condition full, empty;
9    int front, back, count;
10    int elements[20];
11};
12
13void ?{}( Buffer & buffer ) {
14    buffer.front = buffer.back = buffer.count = 0;
15}
16
17int query( Buffer & buffer ) { return buffer.count; }
18
19void insert( Buffer & mutex buffer, int elem ) {
20    if ( buffer.count == 20 ) wait( &buffer.empty );
21    buffer.elements[buffer.back] = elem;
22    buffer.back = ( buffer.back + 1 ) % 20;
23    buffer.count += 1;
24    signal( &buffer.full );
25}
26int remove( Buffer & mutex buffer ) {
27    if ( buffer.count == 0 ) wait( &buffer.full );
28    int elem = buffer.elements[buffer.front];
29    buffer.front = ( buffer.front + 1 ) % 20;
30    buffer.count -= 1;
31    signal( &buffer.empty );
32    return elem;
33}
34
35thread Producer {
36    Buffer * buffer;
37    unsigned int N;
38};
39void main( Producer & prod ) {
40    for ( int i = 1; i <= prod.N; i += 1 ) {
41        yield( (unsigned int)rand48() % 5 );
42        insert( *prod.buffer, 1 );
43    } // for
44    insert( *prod.buffer, -1 );
45}
46void ?{}( Producer & prod, Buffer * buffer, unsigned int N ) {
47    prod.buffer = buffer;
48    prod.N = N;
49}
50
51thread Consumer {
52    Buffer * buffer;
53    int * sum;                                          // summation of producer values
54};
55void main( Consumer & cons ) {
56    *cons.sum = 0;
57    for ( ;; ) {
58        yield( (unsigned int)rand48() % 5 );
59        int item = remove( *cons.buffer );
60      if ( item == -1 ) break;                          // sentinel ?
61        *cons.sum += item;
62    } // for
63}
64void ?{}( Consumer & cons, Buffer * buffer, int * sum ) {
65    cons.buffer = buffer;
66    cons.sum = sum;
67}
68
69forall(dtype T | sized(T) | { void ^?{}(T & mutex); })
70void delete( T * th ) {
71    ^(*th){};
72    free( th );
73}
74
75int main() {
76    Buffer buffer;
77    enum { Prods = 5, Cons = 5 };
78    Producer * prods[Prods];
79    Consumer * cons[Cons];
80    const int Sentinel = -1;
81    int sums[Cons];
82    int i;
83    processor p;
84
85    //rand48seed( getpid() );
86    rand48seed( 1003 );
87
88    for ( i = 0; i < Cons; i += 1 ) {                   // create consumers
89        cons[i] = new( &buffer, &sums[i] );
90    } // for
91    for ( i = 0; i < Prods; i += 1 ) {                  // create producers
92        prods[i] = new( &buffer, 100000u );
93    } // for
94
95    for ( i = 0; i < Prods; i += 1 ) {                  // wait for producers to finish
96        delete( prods[i] );
97    } // for
98    for ( i = 0; i < Cons; i += 1 ) {                   // generate sentinal values to stop consumers
99        insert( buffer, Sentinel );
100    } // for
101    int sum = 0;
102    for ( i = 0; i < Cons; i += 1 ) {                   // wait for consumers to finish
103        delete( cons[i] );
104        sum += sums[i];
105    } // for
106    sout | "total:" | sum | endl;
107}
Note: See TracBrowser for help on using the repository browser.