UniTO/anno2/Galla/MCAD/esercizi2019/bomboloni_sol/secondo_appello/bomb-mon

114 lines
1.9 KiB
Text
Raw Normal View History

2019-01-23 22:06:36 +01:00
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();
}
}