source: tests/concurrent/examples/boundedBufferEXT.cfa@ c829320

ADT arm-eh ast-experimental enum forall-pointer-decay jacob/cs343-translation jenkins-sandbox new-ast new-ast-unique-expr pthread-emulation qualifiedEnum
Last change on this file since c829320 was f8cd310, checked in by Peter A. Buhr <pabuhr@…>, 7 years ago

update file names in emacs compile directive

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