process vassoio{ int b = 0; boolean attesaPiero = false; entry piero_rosa(in String inMess, out String outMess); call mario.friggi(b); b = 30; while(true){ accept piero_rosa(in String inMess, out String outMess) { if(inMess=="piero"){ b--; if(b==0){ outMess = "finiti"; attesaPiero = true; call clock.setTimer(0); } else{ outMess = "non finiti"; } } else if(inMess=="rosa"){ call mario.friggi(b); b = 30; if (attesaPiero) { attesaPiero = false; call Piero.riprendi(); } } } } } process Mario{ entry friggi(in int b_rimasti); while(true){ accept friggi(in int b_rim) { if(b_rim>0) call clock.setTimer(60); } } } process Piero{ entry riprendi(); String mess; while(true){ call vassoio.piero_rosa("piero"); if (mess == "finiti") { accept riprendi() } } } process Rosa{ while(true){ call clock.waitTimer(); call vassoio.piero_rosa("rosa"); } } process Clock{ entry waitTimer(); entry setTimer(in int min); entry tick; int tempo = 0; int sveglia = 0; do [] accept tick -> tempo++; // Incrementa il tempo [] accept setTimer(in int min) { if(min == 0){ // Se Piero ha fatto una setTimer(0).. accept waitTimer() // ..allora sveglio Rosa dalla waitTimer() } else{ sveglia = tempo + min; // Altrimenti setto normalmente la sveglia } } [](tempo == sveglia); accept waitTimer() // Se รจ il momento di svegliare Rosa accettiamo la sua call od } process Tempo{ while(true){ call clock.tick; } }