chan MoneyChan int; chan AckChan bool; class Atm { Branch branch; void ReportError() { } void Run () { bool ok; select { wait(true) -> { send(branch.withdrawl, 10); select { receive(branch.withdrawlStatus, ok) -> if (!ok) ReportError(); } } wait(true) -> { send(branch.deposit, 10); select { receive(branch.depositStatus, ok) -> if (!ok) ReportError(); } } } } }; class Branch { MoneyChan withdrawl; MoneyChan deposit; AckChan withdrawlStatus; AckChan depositStatus; Bank bank; int account; int funds; void Deposit (int amount) { funds = funds + amount; account = account + amount; } bool Withdraw (int amount) { bool ok; if (amount > account) return false; ok = amount > funds; if ( ! ok) { send(bank.withdrawl, amount); select { receive(bank.withdrawlStatus, ok) -> if (ok) funds = funds + amount; } } if (ok) funds = funds - amount; return ok; } void Run () { int amt; int x; while (true) { select end { receive(deposit, amt) -> { Deposit(amt); send(depositStatus, true); } receive(withdrawl, amt) -> { bool ok; ok = Withdraw(amt); //send(withdrawlStatus,ok); } } } } }; class Bank { MoneyChan withdrawl; MoneyChan deposit; AckChan withdrawlStatus; AckChan depositStatus; int funds; void Deposit (int amount) { funds = funds + amount; } bool Withdraw (int amount) { bool ok = (funds > amount); if (ok) { funds = funds - amount; } return ok; } void Run () { int amt; int x; while (true) { select end { receive(deposit, amt) -> { Deposit(amt); send(depositStatus, true); } receive(withdrawl, amt) -> { bool ok; ok = Withdraw(amt); send(withdrawlStatus,ok); } } } } }; class System { static activate void Init () { Bank b = new Bank; Branch br = new Branch; Atm a = new Atm; a.branch = br; br.funds = 0; br.account = 100; br.bank = b; b.funds = 1000; b.withdrawl = new MoneyChan; b.deposit = new MoneyChan; b.withdrawlStatus = new AckChan; b.depositStatus = new AckChan; br.withdrawl = new MoneyChan; br.deposit = new MoneyChan; br.withdrawlStatus = new AckChan; br.depositStatus = new AckChan; async a.Run(); async br.Run(); async b.Run(); } };