Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/tests/concurrent/examples/boundedBufferINT.c

    r58caf150 r88f15ae  
    88// Created On       : Mon Oct 30 12:45:13 2017
    99// Last Modified By : Peter A. Buhr
    10 // Last Modified On : Fri Apr 20 22:18:18 2018
    11 // Update Count     : 78
     10// Last Modified On : Tue Jan  2 12:18:18 2018
     11// Update Count     : 33
    1212//
    1313
    14 #include <stdlib>                                                                               // random
    15 #include <fstream>
     14#include <stdlib>
     15#include <fstream>                                                                              // random
    1616#include <kernel>
    1717#include <thread>
    1818#include <unistd.h>                                                                             // getpid
    1919
    20 //Duration default_preemption() { return 0; }
    21 
    22 enum { BufferSize = 50 };
    23 
    24 forall( otype T )
    2520monitor Buffer {
    2621        condition full, empty;
    2722        int front, back, count;
    28         T elements[BufferSize];
     23        int elements[20];
    2924};
    3025
    31 forall( otype T )
    32 void ?{}( Buffer(T) & buffer ) with( buffer ) { [front, back, count] = 0; }
     26void ?{}( Buffer & buffer ) {
     27        buffer.front = buffer.back = buffer.count = 0;
     28}
    3329
    34 forall( otype T )
    35 int query( Buffer(T) & buffer ) { return buffer.count; }
     30int query( Buffer & buffer ) { return buffer.count; }
    3631
    37 forall( otype T )
    38 void insert( Buffer(T) & mutex buffer, T elem ) with( buffer ) {
    39         if ( count == BufferSize ) wait( empty );
     32void insert( Buffer & mutex buffer, int elem ) with( buffer ) {
     33        if ( count == 20 ) wait( empty );
    4034        elements[back] = elem;
    41         back = ( back + 1 ) % BufferSize;
     35        back = ( back + 1 ) % 20;
    4236        count += 1;
    4337        signal( full );
    4438}
    4539
    46 forall( otype T )
    47 T remove( Buffer(T) & mutex buffer ) with( buffer ) {
     40int remove( Buffer & mutex buffer ) with( buffer ) {
    4841        if ( count == 0 ) wait( full );
    49         T elem = elements[front];
    50         front = ( front + 1 ) % BufferSize;
     42        int elem = elements[front];
     43        front = ( front + 1 ) % 20;
    5144        count -= 1;
    5245        signal( empty );
     
    5447}
    5548
    56 const int Sentinel = -1;
    57 
    5849thread Producer {
    59         Buffer(int) & buffer;
     50        Buffer & buffer;
    6051        unsigned int N;
    6152};
    62 void main( Producer & prod ) with( prod ) {
    63         for ( int i = 1; i <= N; i += 1 ) {
     53void main( Producer & prod ) {
     54        for ( int i = 1; i <= prod.N; i += 1 ) {
    6455                yield( random( 5 ) );
    65                 insert( buffer, 1 );
     56                insert( prod.buffer, 1 );
    6657        } // for
     58        insert( prod.buffer, -1 );
    6759}
    68 void ?{}( Producer & prod, Buffer(int) * buffer, int N ) {
     60void ?{}( Producer & prod, Buffer * buffer, unsigned int N ) {
    6961        &prod.buffer = buffer;
    7062        prod.N = N;
     
    7264
    7365thread Consumer {
    74         Buffer(int) & buffer;
    75         int & sum;                                                                                      // summation of producer values
     66        Buffer & buffer;
     67        int & sum;                                              // summation of producer values
    7668};
    77 void main( Consumer & cons ) with( cons ) {
    78         sum = 0;
     69void main( Consumer & cons ) {
     70        cons.sum = 0;
    7971        for ( ;; ) {
    8072                yield( random( 5 ) );
    81                 int item = remove( buffer );
    82           if ( item == Sentinel ) break;                                        // sentinel ?
    83                 sum += item;
     73                int item = remove( cons.buffer );
     74                if ( item == -1 ) break;                                // sentinel ?
     75                cons.sum += item;
    8476        } // for
    8577}
    86 void ?{}( Consumer & cons, Buffer(int) * buffer, int & sum ) {
     78void ?{}( Consumer & cons, Buffer * buffer, int * sum ) {
    8779        &cons.buffer = buffer;
    88         &cons.sum = &sum;
     80        &cons.sum = sum;
    8981}
    9082
    9183int main() {
    92         Buffer(int) buffer;
    93         enum { Prods = 4, Cons = 5 };
     84        Buffer buffer;
     85        enum { Prods = 5, Cons = 5 };
    9486        Producer * prods[Prods];
    9587        Consumer * cons[Cons];
     88        const int Sentinel = -1;
    9689        int sums[Cons];
    9790        int i;
     
    10194        srandom( 1003 );
    10295
    103         for ( i = 0; i < Cons; i += 1 ) {                                       // create consumers
    104                 cons[i] = new( &buffer, sums[i] );
     96        for ( i = 0; i < Cons; i += 1 ) {                       // create consumers
     97                cons[i] = new( &buffer, &sums[i] );
    10598        } // for
    106         for ( i = 0; i < Prods; i += 1 ) {                                      // create producers
    107                 prods[i] = new( &buffer, 100000 );
     99        for ( i = 0; i < Prods; i += 1 ) {                      // create producers
     100                prods[i] = new( &buffer, 100000u );
    108101        } // for
    109102
    110         for ( i = 0; i < Prods; i += 1 ) {                                      // wait for producers to finish
     103        for ( i = 0; i < Prods; i += 1 ) {                      // wait for producers to finish
    111104                delete( prods[i] );
    112105        } // for
    113         for ( i = 0; i < Cons; i += 1 ) {                                       // generate sentinal values to stop consumers
     106        for ( i = 0; i < Cons; i += 1 ) {                       // generate sentinal values to stop consumers
    114107                insert( buffer, Sentinel );
    115108        } // for
    116109        int sum = 0;
    117         for ( i = 0; i < Cons; i += 1 ) {                                       // wait for consumers to finish
     110        for ( i = 0; i < Cons; i += 1 ) {                       // wait for consumers to finish
    118111                delete( cons[i] );
    119112                sum += sums[i];
     
    124117// Local Variables: //
    125118// tab-width: 4 //
    126 // compile-command: "cfa boundedBufferINT.c" //
     119// compile-command: "cfa boundedBuffer.c" //
    127120// End: //
Note: See TracChangeset for help on using the changeset viewer.