source: tests/concurrent/examples/datingService.cfa@ 01300c4

ADT aaron-thesis arm-eh ast-experimental cleanup-dtors enum forall-pointer-decay jacob/cs343-translation jenkins-sandbox new-ast new-ast-unique-expr pthread-emulation qualifiedEnum
Last change on this file since 01300c4 was a109bb47, checked in by Thierry Delisle <tdelisle@…>, 7 years ago

Hopefully fixed the instability of the DatingService Test

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