UniTO/anno2/Galla/MCAD/esercizi2019/bomboloni_sol/mia_monitor

90 lines
1.5 KiB
Text
Raw Normal View History

2019-01-23 12:03:37 +01:00
Monitor Bancone{
condition friggi;
condition pronti;
int nbomb = 0;
boolean butta = false;
public int friggi_i(){
if(nbomb > 0 and !butta)
wait(friggi);
return nbomb;
public void friggi_f(){
nbomb = 30;
butta = false;
}
public void servi_i(){
if(nbomb == 0)
wait(pronti);
}
public void servi_f(){
nbomb--;
if(nbomb == 0)
signal(friggi);
}
public void scaduti(){
butta = true;
signal(friggi);
}
}
Monitor Clock{
long tick = 0;
long alarm = -1;
condition sleeping;
public void wait_timer(){
if(alarm >= tick and alarm != -1)
wait(sleeping)
}
public void tick(){
tick++;
if(tick >= alarm and !empty sleeping)
signal(sleeping);
}
public void set_timer(long n){
alarm = tick + n;
}
}
Clock clock;
Bancone bancone;
Process Mario{
while(true){
int rimasti = bancone.friggi_i();
if(rimasti > 0) < butta >
< friggi i bomboloni >
bancone.friggi_f();
clock.set_timer(1 ora);
}
}
Process Piero{
while(true){
< attendi cliente >
bancone.servi_i();
< servi cliente >
bancone.servi_f();
}
}
Process Rosa{
while(true){
clock.wait_timer();
bancone.butta();
clock.set_timer(1 ora);
}
}
Process ClockRuns{
while(true){
< hardware tick >
clock.tick();
}
}