114 lines
No EOL
1.9 KiB
Text
114 lines
No EOL
1.9 KiB
Text
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();
|
|
}
|
|
} |