UniTO/anno2/Sem1/Galla/MCAD/esercizi2019/bomboloni_sol/bomb-monitor-cliente-marco.txt

110 lines
1.3 KiB
Text
Raw Normal View History

2019-01-23 22:06:36 +01:00
monitor Vassoio{
int b = 0;
timer_scaduto = false;
condition servi;
condition friggi;
condition cliente;
public int servi(){
while(b == 0 || timer_scaduto || empty(cliente)){
wait(servi);
}
b--;
signal(cliente);
return b;
}
public int friggi(){
if(!(b == 0 && timer_scaduto))
wait(friggi);
return b;
}
public void riempi(){
b = 30;
timer_scaduto = false;
signal(servi);
}
public void butta(){
timer_scaduto = true;
signal(friggi);
}
public void ordina(){
signal(servi);
wait(cliente);
}
}
monitor Alarm{
int now = 0;
int alarm = -1;
condition waiting;
public void tick(){
now++;
if(alarm != -1 && alarm <= now){
alarm = -1;
signal(waiting);
}
}
public void waittimer(){
wait(waiting);
}
public void settimer(int s){
if(s == 0){
alarm = -1;
signal(waiting);
}
else
alarm = now + s;
}
}
Vassoio v;
Alarm a;
Process Mario{
int b;
while(true){
b = v.friggi();
if(b > 0)
<butta>;
<friggi>;
a.settimer(60);
v.riempi();
}
}
Process Piero{
int b;
while(true){
<aspetta cliente>;
b = v.servi();
<servi>;
if (b == 0)
a.settimer(0);
}
}
Process Rosa{
while(true){
a.waittimer();
v.butta();
}
}
Process Clock{
while(true){
<aspetta un secondo>;
a.tick();
}
}
Process Cliente{
v.ordina();
}