-
Notifications
You must be signed in to change notification settings - Fork 0
/
WATCardOffice.cc
107 lines (93 loc) · 3.5 KB
/
WATCardOffice.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include "WATCardOffice.h"
#include <iostream>
using namespace std;
WATCardOffice::Courier::Courier(Printer &prt, Bank &bank, WATCardOffice &office, unsigned int id) :
prt(prt), bank(bank), office(office),id(id) {}
void WATCardOffice::Courier::main() {
prt.print(Printer::Kind::Courier,id, 'S');
for ( ;; ) {
cout << id << " waiting" <<endl;
try {
Job *job = office.requestWork();
} catch ( Quit & ) {
cout << id << " wait dead" <<endl;
_Accept ( ~Courier ) {
prt.print( Printer::Kind::Courier, id, 'F' );
return;
}
}
cout << id << " get job" << endl;
prt.print( rinter::Kind::Courier, id, 't', job->id, job->amount );
bank.withdraw( job->id, job->amount );
if (mprng(1, 6) == 1){
delete job->realCard; //current WATCard is deleted
job->result.exception( new Lost );
prt.print(Printer::Kind::Courier, id, 'L', job->id);
} else {
job->realCard->deposit( job->amount );
job->result.delivery( job->realCard );
prt.print( Printer::Kind::Courier, id, 'T', job->id, job->amount );
}
delete job;
}//for
}
WATCardOffice::WATCardOffice( Printer & prt, Bank & bank, unsigned int numCouriers ) :
prt( prt ), bank( bank ), numCouriers( numCouriers ) {
courierPool = new Courier*[numCouriers];
for ( unsigned int c= 0; c < numCouriers; c++ ) {
courierPool[c] = new Courier( prt, bank, *this, c );
}
}
void WATCardOffice::main() {
prt.print( Printer::Kind::WATCardOffice, 'S' );
for ( ;; ) {
_Accept ( requestWork ) {
_Accept( ~WATCardOffice ) {
cout << "destructor" <<endl;
offWork = true;
clk.signalBlock(); //signal the one requesting work
for ( unsigned int c= 0; c < numCouriers-1; c++ ) {
try {
_Accept( requestWork ); //let the rest exit requestwork busy wait
} catch ( uMutexFailure::RendezvousFailure & ){} //try
}
for ( unsigned int c= 0; c < numCouriers; c++ ) {
delete courierPool[c];
}
delete []courierPool;
prt.print( Printer::Kind::WATCardOffice, 'F' );
return;
} or _When ( noJob == 0 && wantJob != 0 ) _Accept ( create, transfer) {
clk.signalBlock();
}
}
}
}
WATCard::FWATCard WATCardOffice::create( unsigned int sid, unsigned int amount ) {
Job *newJob = new Job( sid, amount, new WATCard() );
jobList[noJob]= newJob;
noJob+=1;
prt.print( Printer::Kind::WATCardOffice, 'C', sid, amount );
return newJob->result;
}
WATCard::FWATCard WATCardOffice::transfer( unsigned int sid, unsigned int amount, WATCard * card ) {
Job *newJob = new Job( sid, amount, card );
// newJob->result.delivery(card);
jobList[noJob] = newJob;
noJob+=1;
prt.print( Printer::Kind::WATCardOffice, 'T', sid, amount );
cout << "transfer" <<endl;
return newJob->result;
}
WATCardOffice::Job * WATCardOffice::requestWork() {
if ( offWork ) throw Quit();
wantJob ++;
cout << "want job " << wantJob << endl;
if (noJob == 0) clk.wait();
cout << "wake up " << wantJob << endl;
if ( offWork ) throw Quit();
wantJob--;
noJob--;
prt.print( Printer::Kind::WATCardOffice, 'W' );
return jobList[noJob];
}