Ignore:
File:
1 edited

Legend:

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

    r1edf37f ra1ecdd1  
    88// Created On       : Mon Oct 30 12:45:13 2017
    99// Last Modified By : Peter A. Buhr
    10 // Last Modified On : Thu Dec 14 21:28:52 2017
    11 // Update Count     : 32
     10// Last Modified On : Wed Dec 13 21:01:49 2017
     11// Update Count     : 27
    1212//
    1313
     
    1818#include <unistd.h>                                                                             // getpid
    1919
     20forall( otype T )
    2021monitor Buffer {
    2122        condition full, empty;
    2223        int front, back, count;
    23         int elements[20];
     24        T elements[20];
    2425};
    2526
    26 void ?{}( Buffer & buffer ) {
     27forall( otype T )
     28void ?{}( Buffer(T) & buffer ) {
    2729        buffer.front = buffer.back = buffer.count = 0;
    2830}
    2931
    30 int query( Buffer & buffer ) { return buffer.count; }
     32forall( otype T )
     33int query( Buffer(T) & buffer ) { return buffer.count; }
    3134
    32 void insert( Buffer & mutex buffer, int elem ) with( buffer ) {
     35forall( otype T )
     36void insert( Buffer(T) & mutex buffer, T elem ) with( buffer ) {
    3337        if ( count == 20 ) wait( empty );
    3438        elements[back] = elem;
     
    3842}
    3943
    40 int remove( Buffer & mutex buffer ) with( buffer ) {
     44forall( otype T )
     45T remove( Buffer(T) & mutex buffer ) with( buffer ) {
    4146        if ( count == 0 ) wait( full );
    42         int elem = elements[front];
     47        T elem = elements[front];
    4348        front = ( front + 1 ) % 20;
    4449        count -= 1;
     
    4853
    4954thread Producer {
    50         Buffer & buffer;
     55        Buffer(int) & buffer;
    5156        unsigned int N;
    5257};
     
    5863        insert( prod.buffer, -1 );
    5964}
    60 void ?{}( Producer & prod, Buffer * buffer, unsigned int N ) {
     65void ?{}( Producer & prod, Buffer(int) * buffer, unsigned int N ) {
    6166        &prod.buffer = buffer;
    6267        prod.N = N;
     
    6469
    6570thread Consumer {
    66         Buffer & buffer;
     71        Buffer(int) & buffer;
    6772        int & sum;                                              // summation of producer values
    6873};
     
    7681        } // for
    7782}
    78 void ?{}( Consumer & cons, Buffer * buffer, int * sum ) {
     83void ?{}( Consumer & cons, Buffer(int) * buffer, int * sum ) {
    7984        &cons.buffer = buffer;
    8085        &cons.sum = sum;
     
    8287
    8388int main() {
    84         Buffer buffer;
     89        Buffer(int) buffer;
    8590        enum { Prods = 5, Cons = 5 };
    8691        Producer * prods[Prods];
Note: See TracChangeset for help on using the changeset viewer.