source: src/tests/concurrent/examples/datingService.c@ 7bdcac1

ADT aaron-thesis arm-eh ast-experimental cleanup-dtors deferred_resn demangler enum forall-pointer-decay jacob/cs343-translation jenkins-sandbox new-ast new-ast-unique-expr new-env no_list persistent-indexer pthread-emulation qualifiedEnum with_gc
Last change on this file since 7bdcac1 was 1213f21, checked in by Peter A. Buhr <pabuhr@…>, 7 years ago

formatting

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