domani mcad please
This commit is contained in:
parent
2e42d4cf4c
commit
00a7905f55
6 changed files with 416 additions and 95 deletions
|
@ -0,0 +1,109 @@
|
||||||
|
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();
|
||||||
|
}
|
|
@ -50,7 +50,6 @@ process Mario{
|
||||||
<friggi>
|
<friggi>
|
||||||
setTimer(60);
|
setTimer(60);
|
||||||
send(s) to p.rilascio_vassoio;
|
send(s) to p.rilascio_vassoio;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@ Process Bancone {
|
||||||
|
|
||||||
[] tick >= alarm and alarm != -1; accept wait_timer() ->
|
[] tick >= alarm and alarm != -1; accept wait_timer() ->
|
||||||
butta = true;
|
butta = true;
|
||||||
nbomb = 0;
|
nbomb = 0; // errore
|
||||||
alarm = -1;
|
alarm = -1;
|
||||||
|
|
||||||
[] ; accept set_timer(in long n) ->
|
[] ; accept set_timer(in long n) ->
|
||||||
|
|
|
@ -3,7 +3,6 @@ monitor Vassoio{
|
||||||
timer_scaduto = false;
|
timer_scaduto = false;
|
||||||
condition servi;
|
condition servi;
|
||||||
condition friggi;
|
condition friggi;
|
||||||
|
|
||||||
public int servi(){
|
public int servi(){
|
||||||
if (b == 0 || timer_scaduto){
|
if (b == 0 || timer_scaduto){
|
||||||
wait(servi);
|
wait(servi);
|
||||||
|
@ -11,30 +10,25 @@ monitor Vassoio{
|
||||||
servi --;
|
servi --;
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int friggi(){
|
public int friggi(){
|
||||||
if(!(b == 0 && timer_scaduto))
|
if(!(b == 0 && timer_scaduto))
|
||||||
wait(friggi);
|
wait(friggi);
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void riempi(){
|
public void riempi(){
|
||||||
b = 30;
|
b = 30;
|
||||||
timer_scaduto = false;
|
timer_scaduto = false;
|
||||||
signal(servi);
|
signal(servi);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void butta(){
|
public void butta(){
|
||||||
timer_scaduto = true;
|
timer_scaduto = true;
|
||||||
signal(friggi);
|
signal(friggi);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
monitor Alarm{
|
monitor Alarm{
|
||||||
int now = 0;
|
int now = 0;
|
||||||
int alarm = -1;
|
int alarm = -1;
|
||||||
condition waiting;
|
condition waiting;
|
||||||
|
|
||||||
public void tick(){
|
public void tick(){
|
||||||
now++;
|
now++;
|
||||||
if(alarm != -1 && alarm <= now){
|
if(alarm != -1 && alarm <= now){
|
||||||
|
@ -42,19 +36,15 @@ monitor Alarm{
|
||||||
signal(waiting);
|
signal(waiting);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void waittimer(){
|
public void waittimer(){
|
||||||
wait(waiting);
|
wait(waiting);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void settimer(int s){
|
public void settimer(int s){
|
||||||
alarm = now + s;
|
alarm = now + s;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Vassoio v;
|
Vassoio v;
|
||||||
Alarm a;
|
Alarm a;
|
||||||
|
|
||||||
Process Mario{
|
Process Mario{
|
||||||
int b;
|
int b;
|
||||||
while(true){
|
while(true){
|
||||||
|
@ -66,7 +56,6 @@ Process Mario{
|
||||||
v.riempi();
|
v.riempi();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Process Piero{
|
Process Piero{
|
||||||
int b;
|
int b;
|
||||||
while(true){
|
while(true){
|
||||||
|
@ -77,14 +66,12 @@ Process Piero{
|
||||||
a.settimer(0);
|
a.settimer(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Process Rosa{
|
Process Rosa{
|
||||||
while(true){
|
while(true){
|
||||||
a.waittimer();
|
a.waittimer();
|
||||||
v.butta();
|
v.butta();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Process Clock{
|
Process Clock{
|
||||||
while(true){
|
while(true){
|
||||||
<aspetta un secondo>;
|
<aspetta un secondo>;
|
|
@ -0,0 +1,112 @@
|
||||||
|
Process Rosa{
|
||||||
|
int nbomb = 0;
|
||||||
|
bool vaiMario = true;
|
||||||
|
signal s;
|
||||||
|
process p;
|
||||||
|
port signal friggi_i;
|
||||||
|
port signal friggi_f;
|
||||||
|
port signal servi_i;
|
||||||
|
port signal servi_f;
|
||||||
|
port signal segnalaMario;
|
||||||
|
|
||||||
|
do
|
||||||
|
* vaiMario == true; p = receive(s) from friggi_i; ->
|
||||||
|
vaiMario = false;
|
||||||
|
send(nbomb) to p.ok;
|
||||||
|
|
||||||
|
* ; p = receive(s) from friggi_f; ->
|
||||||
|
nbomb = 30;
|
||||||
|
|
||||||
|
* nbomb > 0 and !vaiMario; p = receive(s) from servi_i; ->
|
||||||
|
send(s) to p.ok;
|
||||||
|
|
||||||
|
* ; p = receive(s) from servi_f; ->
|
||||||
|
nbomb--;
|
||||||
|
send(nbomb) to p.rimasti;
|
||||||
|
|
||||||
|
* ; p = receive(s) from segnalaMario; ->
|
||||||
|
vaiMario = true;
|
||||||
|
|
||||||
|
od
|
||||||
|
}
|
||||||
|
|
||||||
|
Process Clock{
|
||||||
|
int now = 0;
|
||||||
|
int alarm = -1;
|
||||||
|
signal s;
|
||||||
|
process p;
|
||||||
|
|
||||||
|
do
|
||||||
|
* ; p = receive(s) from tick; ->
|
||||||
|
now++;
|
||||||
|
if(now >= alarm and alarm != -1){
|
||||||
|
alarm = -1;
|
||||||
|
send(s) to Rosa.segnalaMario;
|
||||||
|
}
|
||||||
|
|
||||||
|
* ; p = receive(n) from set_timer; ->
|
||||||
|
if(n == 0){
|
||||||
|
alarm = -1;
|
||||||
|
send(s) to Rosa.segnalaMario;
|
||||||
|
} else {
|
||||||
|
alarm = now + n;
|
||||||
|
}
|
||||||
|
|
||||||
|
od
|
||||||
|
}
|
||||||
|
|
||||||
|
Process Mario{
|
||||||
|
int nbomb = 0;
|
||||||
|
signal s;
|
||||||
|
port int ok;
|
||||||
|
while(true){
|
||||||
|
send(s) to Rosa.friggi_i;
|
||||||
|
p = receive(nbomb) from ok;
|
||||||
|
if(nbomb > 0){
|
||||||
|
< butta >
|
||||||
|
}
|
||||||
|
< friggi >
|
||||||
|
Clock.set_timer(60 minuti);
|
||||||
|
send(s) to Rosa.friggi_f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Process Piero{
|
||||||
|
int nbomb = 0;
|
||||||
|
signal s;
|
||||||
|
port int rimasti;
|
||||||
|
port signal ok;
|
||||||
|
process p;
|
||||||
|
process cliente;
|
||||||
|
|
||||||
|
while(true){
|
||||||
|
client = receive(s) from nuovo_cliente;
|
||||||
|
send(s) to Rosa.servi_i;
|
||||||
|
p = receive(s) from ok;
|
||||||
|
< servi cliente >
|
||||||
|
send(s) to cliente.rilascio;
|
||||||
|
send(s) to Rosa.servi_f;
|
||||||
|
p = receive(nbomb) from rimasti;
|
||||||
|
if(rimasti == 0){
|
||||||
|
Clock.set_timer(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Process Cliente{
|
||||||
|
signal s;
|
||||||
|
port signal rilascio;
|
||||||
|
process p;
|
||||||
|
send(s) to Piero.nuovo_cliente;
|
||||||
|
p = receive(s) from rilascio;
|
||||||
|
< mangia >
|
||||||
|
< esci >
|
||||||
|
}
|
||||||
|
|
||||||
|
Process HWClock{
|
||||||
|
signal s;
|
||||||
|
while(true){
|
||||||
|
< hw tick >
|
||||||
|
send(s) to Clock.tick;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,114 @@
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue