Monitor Bancone{ condition friggi; condition attesaCliente; condition attesaPiero; condition pronti; int nbomb = 0; bool MarioDeveFriggere = false; public int friggi_i(){ if(nbomb>0 or MarioDeveFriggere==true){ wait(friggi); } return nbomb; } public void arrivoCliente(){ wait(attesaCliente); } public void friggi_f(){ nbomb = 30; MarioDeveFriggere = false; signal(pronti); } public void servi_i(){ if(empty(attesaCliente){ wait(attesaPiero); } if(nbomb==0 or MarioDeveFriggere){ wait(pronti); } signal(attesaCliente); } public int servi_f(){ nbomb--; return nbomb; } public void timeout(){ MarioDeveFriggere = true; } } Bancone b; Clock c; Process Mario{ int rimasti = 0; while(true){ rimasti = b.friggi_i(); if(rimasti > 0) < butta > < friggi > c.setTimer(60 minuti); b.friggi_f(); } } Process Rosa{ while(true){ c.waitTimer(); b.timeout(); } } Process Cliente{ b.arrivoCliente(); < mangia > } Process Piero{ int rimasti = 0; while(true){ b.servi_i(); < servi > rimasti = b.servi_f(); if(rimasti == 0) c.setTimer(0); } } Monitor Clock{ int now = 0; int alarm = -1; public void setTimer(int n){ if(n == 0){ alarm = -1; signal(sveglia); } else alarm = now+n; } public void waitTimer(){ if(alarm == -1 or alarm>tick){ wait(sveglia); } } public void tick(){ now++; if(now >= alarm){ signal(sveglia); } } } process HwClock{ while(true){ < hw interrupt > c.tick(); } }