Changeset 58caf150


Ignore:
Timestamp:
Apr 20, 2018, 10:59:51 PM (7 years ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, with_gc
Children:
c8ad5d9
Parents:
f14d956
Message:

updates

Location:
src/tests/concurrent/examples
Files:
2 edited

Legend:

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

    rf14d956 r58caf150  
    88// Created On       : Wed Apr 18 22:52:12 2018
    99// Last Modified By : Peter A. Buhr
    10 // Last Modified On : Wed Apr 18 22:56:17 2018
    11 // Update Count     : 2
     10// Last Modified On : Fri Apr 20 22:25:14 2018
     11// Update Count     : 6
    1212//
    1313
     
    2020//Duration default_preemption() { return 0; }
    2121
    22 enum { BufferSize = 5 };
     22enum { BufferSize = 50 };
    2323
    2424forall( otype T )
     
    3333forall( otype T )
    3434int query( Buffer(T) & buffer ) { return buffer.count; }
     35
     36forall( otype T )                                                                               // forward
     37T remove( Buffer(T) & mutex buffer );
    3538
    3639forall( otype T )
  • src/tests/concurrent/examples/boundedBufferINT.c

    rf14d956 r58caf150  
    88// Created On       : Mon Oct 30 12:45:13 2017
    99// Last Modified By : Peter A. Buhr
    10 // Last Modified On : Tue Jan  2 12:18:18 2018
    11 // Update Count     : 33
     10// Last Modified On : Fri Apr 20 22:18:18 2018
     11// Update Count     : 78
    1212//
    1313
    14 #include <stdlib>
    15 #include <fstream>                                                                              // random
     14#include <stdlib>                                                                               // random
     15#include <fstream>
    1616#include <kernel>
    1717#include <thread>
    1818#include <unistd.h>                                                                             // getpid
    1919
     20//Duration default_preemption() { return 0; }
     21
     22enum { BufferSize = 50 };
     23
     24forall( otype T )
    2025monitor Buffer {
    2126        condition full, empty;
    2227        int front, back, count;
    23         int elements[20];
     28        T elements[BufferSize];
    2429};
    2530
    26 void ?{}( Buffer & buffer ) {
    27         buffer.front = buffer.back = buffer.count = 0;
    28 }
     31forall( otype T )
     32void ?{}( Buffer(T) & buffer ) with( buffer ) { [front, back, count] = 0; }
    2933
    30 int query( Buffer & buffer ) { return buffer.count; }
     34forall( otype T )
     35int query( Buffer(T) & buffer ) { return buffer.count; }
    3136
    32 void insert( Buffer & mutex buffer, int elem ) with( buffer ) {
    33         if ( count == 20 ) wait( empty );
     37forall( otype T )
     38void insert( Buffer(T) & mutex buffer, T elem ) with( buffer ) {
     39        if ( count == BufferSize ) wait( empty );
    3440        elements[back] = elem;
    35         back = ( back + 1 ) % 20;
     41        back = ( back + 1 ) % BufferSize;
    3642        count += 1;
    3743        signal( full );
    3844}
    3945
    40 int remove( Buffer & mutex buffer ) with( buffer ) {
     46forall( otype T )
     47T remove( Buffer(T) & mutex buffer ) with( buffer ) {
    4148        if ( count == 0 ) wait( full );
    42         int elem = elements[front];
    43         front = ( front + 1 ) % 20;
     49        T elem = elements[front];
     50        front = ( front + 1 ) % BufferSize;
    4451        count -= 1;
    4552        signal( empty );
     
    4754}
    4855
     56const int Sentinel = -1;
     57
    4958thread Producer {
    50         Buffer & buffer;
     59        Buffer(int) & buffer;
    5160        unsigned int N;
    5261};
    53 void main( Producer & prod ) {
    54         for ( int i = 1; i <= prod.N; i += 1 ) {
     62void main( Producer & prod ) with( prod ) {
     63        for ( int i = 1; i <= N; i += 1 ) {
    5564                yield( random( 5 ) );
    56                 insert( prod.buffer, 1 );
     65                insert( buffer, 1 );
    5766        } // for
    58         insert( prod.buffer, -1 );
    5967}
    60 void ?{}( Producer & prod, Buffer * buffer, unsigned int N ) {
     68void ?{}( Producer & prod, Buffer(int) * buffer, int N ) {
    6169        &prod.buffer = buffer;
    6270        prod.N = N;
     
    6472
    6573thread Consumer {
    66         Buffer & buffer;
    67         int & sum;                                              // summation of producer values
     74        Buffer(int) & buffer;
     75        int & sum;                                                                                      // summation of producer values
    6876};
    69 void main( Consumer & cons ) {
    70         cons.sum = 0;
     77void main( Consumer & cons ) with( cons ) {
     78        sum = 0;
    7179        for ( ;; ) {
    7280                yield( random( 5 ) );
    73                 int item = remove( cons.buffer );
    74                 if ( item == -1 ) break;                                // sentinel ?
    75                 cons.sum += item;
     81                int item = remove( buffer );
     82          if ( item == Sentinel ) break;                                        // sentinel ?
     83                sum += item;
    7684        } // for
    7785}
    78 void ?{}( Consumer & cons, Buffer * buffer, int * sum ) {
     86void ?{}( Consumer & cons, Buffer(int) * buffer, int & sum ) {
    7987        &cons.buffer = buffer;
    80         &cons.sum = sum;
     88        &cons.sum = &sum;
    8189}
    8290
    8391int main() {
    84         Buffer buffer;
    85         enum { Prods = 5, Cons = 5 };
     92        Buffer(int) buffer;
     93        enum { Prods = 4, Cons = 5 };
    8694        Producer * prods[Prods];
    8795        Consumer * cons[Cons];
    88         const int Sentinel = -1;
    8996        int sums[Cons];
    9097        int i;
     
    94101        srandom( 1003 );
    95102
    96         for ( i = 0; i < Cons; i += 1 ) {                       // create consumers
    97                 cons[i] = new( &buffer, &sums[i] );
     103        for ( i = 0; i < Cons; i += 1 ) {                                       // create consumers
     104                cons[i] = new( &buffer, sums[i] );
    98105        } // for
    99         for ( i = 0; i < Prods; i += 1 ) {                      // create producers
    100                 prods[i] = new( &buffer, 100000u );
     106        for ( i = 0; i < Prods; i += 1 ) {                                      // create producers
     107                prods[i] = new( &buffer, 100000 );
    101108        } // for
    102109
    103         for ( i = 0; i < Prods; i += 1 ) {                      // wait for producers to finish
     110        for ( i = 0; i < Prods; i += 1 ) {                                      // wait for producers to finish
    104111                delete( prods[i] );
    105112        } // for
    106         for ( i = 0; i < Cons; i += 1 ) {                       // generate sentinal values to stop consumers
     113        for ( i = 0; i < Cons; i += 1 ) {                                       // generate sentinal values to stop consumers
    107114                insert( buffer, Sentinel );
    108115        } // for
    109116        int sum = 0;
    110         for ( i = 0; i < Cons; i += 1 ) {                       // wait for consumers to finish
     117        for ( i = 0; i < Cons; i += 1 ) {                                       // wait for consumers to finish
    111118                delete( cons[i] );
    112119                sum += sums[i];
     
    117124// Local Variables: //
    118125// tab-width: 4 //
    119 // compile-command: "cfa boundedBuffer.c" //
     126// compile-command: "cfa boundedBufferINT.c" //
    120127// End: //
Note: See TracChangeset for help on using the changeset viewer.