Ignore:
File:
1 edited

Legend:

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

    r623c16a r58caf150  
    1 //
     1// 
    22// The contents of this file are covered under the licence agreement in the
    33// file "LICENCE" distributed with Cforall.
    4 //
    5 // boundedBufferEXT.c --
    6 //
     4// 
     5// boundedBufferEXT.c -- 
     6// 
    77// Author           : Peter A. Buhr
    88// Created On       : Wed Apr 18 22:52:12 2018
    99// Last Modified By : Peter A. Buhr
    10 // Last Modified On : Wed May  2 16:12:58 2018
    11 // Update Count     : 7
    12 //
     10// Last Modified On : Fri Apr 20 22:25:14 2018
     11// Update Count     : 6
     12// 
    1313
    1414#include <stdlib>                                                                               // random
     
    2222enum { BufferSize = 50 };
    2323
    24 forall( otype T ) {
    25         monitor Buffer {
    26                 int front, back, count;
    27                 T elements[BufferSize];
    28         }; // Buffer
     24forall( otype T )
     25monitor Buffer {
     26        int front, back, count;
     27        T elements[BufferSize];
     28};
    2929
    30         void ?{}( Buffer(T) & buffer ) with( buffer ) { [front, back, count] = 0; }
     30forall( otype T )
     31void ?{}( Buffer(T) & buffer ) with( buffer ) { [front, back, count] = 0; }
    3132
    32         int query( Buffer(T) & buffer ) { return buffer.count; } // read-only, no mutual exclusion
     33forall( otype T )
     34int query( Buffer(T) & buffer ) { return buffer.count; }
    3335
    34         T remove( Buffer(T) & mutex buffer );                           // forward
     36forall( otype T )                                                                               // forward
     37T remove( Buffer(T) & mutex buffer );
    3538
    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
     39forall( otype T )
     40void 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}
    4246
    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         } // remove
     47forall( otype T )
     48T 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;
    5054}
    5155
Note: See TracChangeset for help on using the changeset viewer.