source: tests/concurrent/examples/boundedBufferEXT.cfa@ 1931bb01

ADT ast-experimental pthread-emulation qualifiedEnum
Last change on this file since 1931bb01 was fd54fef, checked in by Michael Brooks <mlbrooks@…>, 5 years ago

Converting the project to use the new syntax for otype, dtype and ttytpe.

Changed prelude (gen), libcfa and test suite to use it. Added a simple deprecation rule of the old syntax to the parser; we might wish to support both syntaxes "officially," like with an extra CLI switch, but this measure should serve as a simple reminder for our team to try the new syntax.

  • Property mode set to 100644
File size: 2.9 KB
RevLine 
[b9f383f]1//
[2e457d8]2// Cforall Version 1.0.0 Copyright (C) 2018 University of Waterloo
[ebb7b66]3//
[88f15ae]4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
[b9f383f]6//
7// boundedBufferEXT.c --
8//
[88f15ae]9// Author : Peter A. Buhr
10// Created On : Wed Apr 18 22:52:12 2018
11// Last Modified By : Peter A. Buhr
[cca568e]12// Last Modified On : Thu Jan 16 22:36:34 2020
13// Update Count : 15
[b9f383f]14//
[88f15ae]15
[2e457d8]16#include <stdlib.hfa> // random
[73abe95]17#include <fstream.hfa>
18#include <kernel.hfa>
19#include <thread.hfa>
[88f15ae]20#include <unistd.h> // getpid
21
22//Duration default_preemption() { return 0; }
23
[58caf150]24enum { BufferSize = 50 };
[88f15ae]25
[fd54fef]26forall( T ) {
[623c16a]27 monitor Buffer {
28 int front, back, count;
29 T elements[BufferSize];
30 }; // Buffer
[88f15ae]31
[623c16a]32 void ?{}( Buffer(T) & buffer ) with( buffer ) { [front, back, count] = 0; }
[88f15ae]33
[623c16a]34 int query( Buffer(T) & buffer ) { return buffer.count; } // read-only, no mutual exclusion
[88f15ae]35
[623c16a]36 T remove( Buffer(T) & mutex buffer ); // forward
[58caf150]37
[623c16a]38 void insert( Buffer(T) & mutex buffer, T elem ) with( buffer ) {
[cca568e]39 if ( count == BufferSize ) waitfor( remove : buffer );
[623c16a]40 elements[back] = elem;
41 back = ( back + 1 ) % BufferSize;
42 count += 1;
43 } // insert
[88f15ae]44
[623c16a]45 T remove( Buffer(T) & mutex buffer ) with( buffer ) {
[cca568e]46 if ( count == 0 ) waitfor( insert : buffer );
[623c16a]47 T elem = elements[front];
48 front = ( front + 1 ) % BufferSize;
49 count -= 1;
50 return elem;
51 } // remove
[88f15ae]52}
53
[3aa1d22]54enum { Sentinel = -1 };
[88f15ae]55
56thread Producer {
57 Buffer(int) & buffer;
58 unsigned int N;
59};
60void main( Producer & prod ) with( prod ) {
[3aa1d22]61 for ( i; 1 ~= N ) {
[88f15ae]62 yield( random( 5 ) );
63 insert( buffer, 1 );
64 } // for
65}
66void ?{}( Producer & prod, Buffer(int) * buffer, int N ) {
67 &prod.buffer = buffer;
68 prod.N = N;
69}
70
71thread Consumer {
72 Buffer(int) & buffer;
73 int & sum; // summation of producer values
74};
75void main( Consumer & cons ) with( cons ) {
76 sum = 0;
[adb6b30f]77 for () {
[88f15ae]78 yield( random( 5 ) );
79 int item = remove( buffer );
80 if ( item == Sentinel ) break; // sentinel ?
81 sum += item;
82 } // for
83}
84void ?{}( Consumer & cons, Buffer(int) * buffer, int & sum ) {
85 &cons.buffer = buffer;
86 &cons.sum = &sum;
87}
88
[ebb7b66]89enum { Prods = 4, Cons = 5 };
90Producer * prods[Prods];
91Consumer * cons[Cons];
92
[88f15ae]93int main() {
94 Buffer(int) buffer;
95 int sums[Cons];
96 int i;
97 processor p;
98
99 //srandom( getpid() );
100 srandom( 1003 );
101
[3aa1d22]102 for ( i; Cons ) { // create consumers
[88f15ae]103 cons[i] = new( &buffer, sums[i] );
104 } // for
[3aa1d22]105 for ( i; Prods ) { // create producers
[88f15ae]106 prods[i] = new( &buffer, 100000 );
107 } // for
108
[3aa1d22]109 for ( i; Prods ) { // wait for producers to finish
[88f15ae]110 delete( prods[i] );
111 } // for
[3aa1d22]112 for ( i; Cons ) { // generate sentinal values to stop consumers
[88f15ae]113 insert( buffer, Sentinel );
114 } // for
115 int sum = 0;
[3aa1d22]116 for ( i; Cons ) { // wait for consumers to finish
[88f15ae]117 delete( cons[i] );
118 sum += sums[i];
119 } // for
[200fcb3]120 sout | "total:" | sum;
[88f15ae]121}
122
123// Local Variables: //
124// tab-width: 4 //
[f8cd310]125// compile-command: "cfa boundedBufferEXT.cfa" //
[88f15ae]126// End: //
Note: See TracBrowser for help on using the repository browser.