source: tests/concurrency/examples/datingService.cfa@ 1db6d70

ast-experimental
Last change on this file since 1db6d70 was c26bea2a, checked in by Peter A. Buhr <pabuhr@…>, 2 years ago

first attempt at renaming directory tests/concurrent to tests/concurrency to harmonize with other concurrency directory names

  • Property mode set to 100644
File size: 3.4 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2017 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// datingService.c --
8//
9// Author : Peter A. Buhr
10// Created On : Mon Oct 30 12:56:20 2017
11// Last Modified By : Peter A. Buhr
12// Last Modified On : Sun Sep 27 15:42:25 2020
13// Update Count : 40
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
22enum { CompCodes = 20 }; // number of compatibility codes
23
24monitor DatingService {
25 condition Girls[CompCodes], Boys[CompCodes];
26 unsigned int GirlPhoneNo, BoyPhoneNo;
27}; // DatingService
28
29unsigned int girl( DatingService & mutex ds, unsigned int PhoneNo, unsigned int ccode ) with( ds ) {
30 if ( is_empty( Boys[ccode] ) ) { // no compatible boy ?
31 wait( Girls[ccode] ); // wait for boy
32 GirlPhoneNo = PhoneNo; // make phone number available
33 } else {
34 GirlPhoneNo = PhoneNo; // make phone number available
35 signal_block( Boys[ccode] ); // restart boy to set phone number
36 } // if
37 // sout | "Girl:" | PhoneNo | "is dating Boy at" | BoyPhoneNo | "with ccode" | ccode;
38 return BoyPhoneNo;
39} // DatingService girl
40
41unsigned int boy( DatingService & mutex ds, unsigned int PhoneNo, unsigned int ccode ) with( ds ) {
42 if ( is_empty( Girls[ccode] ) ) { // no compatible girl ?
43 wait( Boys[ccode] ); // wait for girl
44 BoyPhoneNo = PhoneNo; // make phone number available
45 } else {
46 BoyPhoneNo = PhoneNo; // make phone number available
47 signal_block( Girls[ccode] ); // restart girl to set phone number
48 } // if
49 // sout | " Boy:" | PhoneNo | "is dating Girl" | GirlPhoneNo | "with ccode" | ccode;
50 return GirlPhoneNo;
51} // DatingService boy
52
53unsigned int girlck[CompCodes];
54unsigned int boyck[CompCodes];
55
56thread Girl {
57 DatingService & TheExchange;
58 unsigned int id, ccode;
59}; // Girl
60
61void main( Girl & g ) with( g ) {
62 yield( random( 100 ) ); // don't all start at the same time
63 unsigned int partner = girl( TheExchange, id, ccode );
64 girlck[id] = partner;
65} // Girl main
66
67void ?{}( Girl & g, DatingService * TheExchange, unsigned int id, unsigned int ccode ) {
68 &g.TheExchange = TheExchange;
69 g.id = id;
70 g.ccode = ccode;
71} // Girl ?{}
72
73thread Boy {
74 DatingService & TheExchange;
75 unsigned int id, ccode;
76}; // Boy
77
78void main( Boy & b ) with( b ) {
79 yield( random( 100 ) ); // don't all start at the same time
80 unsigned int partner = boy( TheExchange, id, ccode );
81 boyck[id] = partner;
82} // Boy main
83
84void ?{}( Boy & b, DatingService * TheExchange, unsigned int id, unsigned int ccode ) {
85 &b.TheExchange = TheExchange;
86 b.id = id;
87 b.ccode = ccode;
88} // Boy ?{}
89
90int main() {
91 DatingService TheExchange;
92 Girl * girls[CompCodes];
93 Boy * boys[CompCodes];
94
95 srandom( /*getpid()*/ 103 );
96
97 for ( i; (unsigned int)CompCodes ) {
98 girls[i] = new( &TheExchange, i, i ); // TheExchange constructor needs unsigned int
99 boys[i] = new( &TheExchange, i, CompCodes - ( i + 1 ) );
100 } // for
101
102 for ( i; CompCodes ) {
103 delete( boys[i] );
104 delete( girls[i] );
105 } // for
106
107 for ( i; CompCodes ) {
108 if ( girlck[ boyck[i] ] != boyck[ girlck[i] ] ) abort();
109 } // for
110
111 printf( "done\n" ); // non-empty .expect file
112} // main
113
114// Local Variables: //
115// tab-width: 4 //
116// compile-command: "cfa datingService.cfa" //
117// End: //
Note: See TracBrowser for help on using the repository browser.