giorno prima
This commit is contained in:
parent
233233ee43
commit
0a7668d13f
13 changed files with 986 additions and 0 deletions
|
@ -0,0 +1,85 @@
|
||||||
|
process vassoio{
|
||||||
|
int b = 0;
|
||||||
|
port String piero_rosa;
|
||||||
|
String mess;
|
||||||
|
port signal rilascio_vassoio;
|
||||||
|
signal s;
|
||||||
|
boolean attesaPiero = false;
|
||||||
|
process pMario;
|
||||||
|
process pPieroRosa;
|
||||||
|
|
||||||
|
send(b) to mario.friggi; // Chiede a Mario di friggere
|
||||||
|
pMario = receive(s) from rilascio_vassoio; // Aspetta che frigga
|
||||||
|
b = 30;
|
||||||
|
while(true){
|
||||||
|
pPieroRosa = receive(mess) from piero_rosa; // Aspetta i messaggi da Piero o da Rosa
|
||||||
|
if(mess=="piero"){
|
||||||
|
b--;
|
||||||
|
if(b==0){ // Se era l'ultimo bombolone..
|
||||||
|
attesaPiero = true;
|
||||||
|
send("finiti") to pPieroRosa.servi; // ..dice a Piero che sono finiti
|
||||||
|
setTimer(0); // e va a svegliare Rosa
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
send("non finiti") to pPieroRosa.servi; // altrimenti dice a Piero che ci sono ancora bomboloni
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(mess=="rosa"){
|
||||||
|
send(b) to mario.friggi; // Chiede a Mario di friggere
|
||||||
|
pMario = receive(s) from rilascio_vassoio; // Aspetta che frigga
|
||||||
|
b = 30;
|
||||||
|
send(s) to rosa.rilascio_rosa; // Avverte Rosa che Mario ha fritto
|
||||||
|
if(attesaPiero) { // Se Piero ha venduto l'ultimo ed era in attesa..
|
||||||
|
attesaPiero = false;
|
||||||
|
send(s) to piero.riprendi; // ..lo sveglia
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process Mario{
|
||||||
|
process p;
|
||||||
|
signal s;
|
||||||
|
port int friggi;
|
||||||
|
int b_rim;
|
||||||
|
|
||||||
|
while(true){
|
||||||
|
p = receive(b_rim) from friggi; // Aspetta di essere fritto dal vassoio
|
||||||
|
if(b_rim>0){ // Se c'erano bomboloni scaduti, li butta
|
||||||
|
<butta>
|
||||||
|
}
|
||||||
|
<friggi>
|
||||||
|
setTimer(60);
|
||||||
|
send(s) to p.rilascio_vassoio; // Comunica al vassoio che è fritto
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process Piero{
|
||||||
|
process p;
|
||||||
|
port signal riprendi;
|
||||||
|
signal s;
|
||||||
|
port String servi;
|
||||||
|
String mess;
|
||||||
|
|
||||||
|
while(true){
|
||||||
|
<attendi clienti>
|
||||||
|
send("piero") to vassoio.piero_rosa; // Comunica al vassoio che deve servire un cliente
|
||||||
|
p = receive(mess) from servi; // Aspetta di poter servire
|
||||||
|
<servo cliente>
|
||||||
|
if(mess == "finiti"){ // Se il vassoio comunica che i bomboloni sono finiti..
|
||||||
|
p = receive(s) from riprendi; // ..si mette in attesa di poter riprendere
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process Rosa{
|
||||||
|
port signal rilascio_rosa;
|
||||||
|
signal s;
|
||||||
|
process p;
|
||||||
|
|
||||||
|
while(true){
|
||||||
|
waitTimer();
|
||||||
|
send("rosa") to vassoio.piero_rosa; // Avverte il vassoio di far friggere Mario
|
||||||
|
p = receive(s) from rilascio_rosa; // Aspetta che sia fritto
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,61 @@
|
||||||
|
monitor bomboloni{
|
||||||
|
int b = 0
|
||||||
|
conditionition mario;
|
||||||
|
condition piero;
|
||||||
|
condition cliente;
|
||||||
|
condition rosa;
|
||||||
|
boolean deveFriggere = false;
|
||||||
|
|
||||||
|
public void mario(){
|
||||||
|
if (!deveFriggere) wait(mario); // Si blocca in attesa che Rosa lo sblocchi per friggere
|
||||||
|
if(b>0) <butta i bomboloni> // Se c'erano bomboloni scaduti, li butta
|
||||||
|
<Friggi bomboloni>
|
||||||
|
deveFriggere = false;
|
||||||
|
b=30;
|
||||||
|
setTimer(60);
|
||||||
|
signal(piero); // Sblocca Piero
|
||||||
|
if(!empty(rosa)){ // Se Rosa prende il monitor prima di Mario resterà in attesa e..
|
||||||
|
signal(rosa); // ..verrà svegliata dopo che Mario ha fritto
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void piero(){
|
||||||
|
if (b == 0){ // Quando finiscono i bomboloni..
|
||||||
|
setTimer(0); // ..sveglia Rosa
|
||||||
|
wait(piero); // e si mette in attesa
|
||||||
|
}
|
||||||
|
wait(cliente);
|
||||||
|
b--;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void rosa(){
|
||||||
|
deveFriggere = true; // Se Rosa viene svegliata dobbiamo sicuramente friggere
|
||||||
|
if(!empty(mario)){ // Se Mario è già arrivato, lo sveglia
|
||||||
|
signal(mario);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
wait(rosa); // Altrimenti si mette in attesa che Mario arrivi
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bomboloni alpha;
|
||||||
|
process piero(){
|
||||||
|
while(true){
|
||||||
|
alpha.piero;
|
||||||
|
<Servi>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process mario(){
|
||||||
|
while(true){
|
||||||
|
alpha.mario;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process rosa(){
|
||||||
|
while(true){
|
||||||
|
waitTimer()
|
||||||
|
alpha.rosa;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,68 @@
|
||||||
|
process vassoio{
|
||||||
|
int b = 0;
|
||||||
|
entry piero_rosa(in String inMess, out String outMess);
|
||||||
|
boolean attesaPiero = false;
|
||||||
|
|
||||||
|
call mario.friggi(b); // Chiama Mario per friggere
|
||||||
|
b = 30;
|
||||||
|
while(true){
|
||||||
|
accept piero_rosa(in String inMess, out String outMess) // Aspetta una richiesta da Piero o da Rosa
|
||||||
|
{
|
||||||
|
if(inMess=="piero"){
|
||||||
|
b--;
|
||||||
|
if(b==0){ // Se era l'ultimo bombolone..
|
||||||
|
attesaPiero = true;
|
||||||
|
outMess = "finiti"; // setta l'output per dire a Piero che sono finiti
|
||||||
|
setTimer(0); // e va a svegliare Rosa
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
outMess = "non finiti"; // setta l'output per dire a Piero che non sono finiti
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(inMess=="rosa"){
|
||||||
|
call mario.friggi(b); // Chiede a Mario di friggere
|
||||||
|
b = 30;
|
||||||
|
if (attesaPiero) { // Se Piero ha venduto l'ultimo ed era in attesa..
|
||||||
|
attesaPiero = false;
|
||||||
|
call piero.riprendi(); // ..lo sveglia
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process Mario{
|
||||||
|
entry friggi(in int b_rim);
|
||||||
|
|
||||||
|
while(true){
|
||||||
|
accept friggi(in int b_rim) // Aspetta di essere fritto dal vassoio
|
||||||
|
{
|
||||||
|
if(b_rim>0){ // Se c'erano bomboloni scaduti, li butta
|
||||||
|
<butta>
|
||||||
|
}
|
||||||
|
<friggi>
|
||||||
|
setTimer(60);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process Piero{
|
||||||
|
entry riprendi();
|
||||||
|
String mess;
|
||||||
|
|
||||||
|
while(true){
|
||||||
|
<attendi clienti>
|
||||||
|
call vassoio.piero_rosa("piero"); // Comunica al vassoio che deve servire un cliente
|
||||||
|
<servo cliente>
|
||||||
|
if (mess == "finiti") { // Se il vassoio comunica che i bomboloni sono finiti..
|
||||||
|
accept riprendi() // ..si mette in attesa di poter riprendere
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process Rosa{
|
||||||
|
while(true){
|
||||||
|
waitTimer();
|
||||||
|
call vassoio.piero_rosa("rosa"); // Avverte il vassoio di far friggere Mario
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
semaphoreaphore mario = 0;
|
||||||
|
semaphore cliente = 0;
|
||||||
|
semaphore mutex = 1;
|
||||||
|
semaphore rosa = 0;
|
||||||
|
semaphore piero = 0;
|
||||||
|
int b = 0;
|
||||||
|
boolean attesaPiero = false;
|
||||||
|
|
||||||
|
process mario(){
|
||||||
|
<friggi>
|
||||||
|
b=30;
|
||||||
|
setTimer(60);
|
||||||
|
V(piero); // Serve a Piero per partire
|
||||||
|
while(true){
|
||||||
|
P(mario); // Si blocca in attesa che Rosa lo sblocchi per friggere
|
||||||
|
if(b>0) <Butta> // Se c'erano bomboloni scaduti, li butta
|
||||||
|
<Friggi bomboloni>
|
||||||
|
b=30;
|
||||||
|
setTimer(60);
|
||||||
|
if(attesaPiero){ // Se erano finiti i bomboloni dobbiamo sbloccare Piero con la V(piero)
|
||||||
|
attesaPiero = false;
|
||||||
|
V(piero);
|
||||||
|
}
|
||||||
|
V(rosa); // Sblocchiamo Rosa
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process piero(){
|
||||||
|
P(piero); // Blocca Piero per la prima esecuzione. Viene sbloccato da Mario
|
||||||
|
while(true){
|
||||||
|
P(cliente); // Attende il cliente
|
||||||
|
P(mutex); // Per la mutua esclusione con Rosa
|
||||||
|
<Servi>
|
||||||
|
b--;
|
||||||
|
if(b==0){ // Quando finiscono i bomboloni..
|
||||||
|
attesaPiero = true;
|
||||||
|
setTimer(0); // ..sveglia Rosa
|
||||||
|
V(mutex);
|
||||||
|
P(piero); // e Piero si mette in attesa. Sarà svegliato da Mario
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
V(mutex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process rosa(){
|
||||||
|
while(true){
|
||||||
|
waitTimer(); // Bloccata sulla waitTimer(). All'inizio timer=+infinito. Settato a 60 da Mario
|
||||||
|
P(mutex); // Per la mutua esclusione con Piero
|
||||||
|
V(mario); // Sveglia Mario
|
||||||
|
P(rosa); // Si blocca in attesa che Mario frigga
|
||||||
|
V(mutex);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,98 @@
|
||||||
|
process vassoio{
|
||||||
|
int b = 0;
|
||||||
|
port String piero_rosa;
|
||||||
|
String mess;
|
||||||
|
port signal rilascio_vassoio;
|
||||||
|
signal s;
|
||||||
|
process pPieroRosa;
|
||||||
|
process pMario;
|
||||||
|
boolean attesaPiero = false;
|
||||||
|
|
||||||
|
send(b) to Mario.friggi;
|
||||||
|
pMario = receive(s) from rilascio_vassoio;
|
||||||
|
b = 30;
|
||||||
|
while(true){
|
||||||
|
pPieroRosa = receive(mess) from piero_rosa;
|
||||||
|
if(mess=="piero"){
|
||||||
|
b--;
|
||||||
|
if(b==0){
|
||||||
|
attesaPiero = true;
|
||||||
|
send("finiti") to pPieroRosa.servi;
|
||||||
|
setTimer(0);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
send("non finiti") to pPieroRosa.servi;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(mess=="rosa"){
|
||||||
|
send(b) to Mario.friggi;
|
||||||
|
pMario = receive(s) from rilascio_vassoio;
|
||||||
|
b = 30;
|
||||||
|
send(s) to Rosa.rilascio_rosa;
|
||||||
|
if(attesaPiero) {
|
||||||
|
attesaPiero = false;
|
||||||
|
send(s) to Piero.riprendi;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process Mario{
|
||||||
|
process p;
|
||||||
|
signal s;
|
||||||
|
port int friggi;
|
||||||
|
int b_rim;
|
||||||
|
while(true){
|
||||||
|
p = receive(b_rim) from friggi;
|
||||||
|
if(b_rim>0){
|
||||||
|
<butta>
|
||||||
|
}
|
||||||
|
<friggi>
|
||||||
|
setTimer(60);
|
||||||
|
send(s) to p.rilascio_vassoio;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process Piero{
|
||||||
|
process pCliente;
|
||||||
|
process pVassoio;
|
||||||
|
port signal riprendi;
|
||||||
|
signal s;
|
||||||
|
port String servi;
|
||||||
|
String mess;
|
||||||
|
port signal cliente;
|
||||||
|
|
||||||
|
while(true){
|
||||||
|
pCliente = receive(s) from cliente; // Aspetta un cliente
|
||||||
|
send("piero") to vassoio.piero_rosa;
|
||||||
|
pVassoio = receive(mess) from servi;
|
||||||
|
<servo clienti>
|
||||||
|
send(s) to pCliente.rilascio_cliente; // Comunica al cliente che lo ha servito
|
||||||
|
if(mess == "finiti"){
|
||||||
|
p = receive(s) from riprendi;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process Rosa{
|
||||||
|
port signal rilascio_rosa;
|
||||||
|
signal s;
|
||||||
|
process p;
|
||||||
|
while(true){
|
||||||
|
waitTimer();
|
||||||
|
send("rosa") to vassoio.piero_rosa;
|
||||||
|
p = receive(s) from rilascio_rosa;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process Cliente{
|
||||||
|
port signal rilascio_cliente;
|
||||||
|
process p;
|
||||||
|
signal s;
|
||||||
|
|
||||||
|
send(s) to Piero.cliente; // Chiede a Piero un bombolone
|
||||||
|
p = receive(s) from rilascio_cliente; // Aspetta di riceverlo
|
||||||
|
<Mangia bombolone> // Frigge il timer
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,79 @@
|
||||||
|
monitor bomboloni{
|
||||||
|
int b = 0;
|
||||||
|
condition mario;
|
||||||
|
condition piero;
|
||||||
|
condition cliente;
|
||||||
|
condition codaPiero;
|
||||||
|
condition rosa;
|
||||||
|
boolean deveFriggere = false;
|
||||||
|
|
||||||
|
public void mario(){
|
||||||
|
if (!deveFriggere) wait(mario);
|
||||||
|
if(b>0) <butta i bomboloni>
|
||||||
|
<friggi bomboloni>
|
||||||
|
deveFriggere = false;
|
||||||
|
b=30;
|
||||||
|
setTimer(60);
|
||||||
|
signal(piero);
|
||||||
|
if(!empty(rosa)){
|
||||||
|
signal(rosa);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void piero(){
|
||||||
|
if (b == 0){
|
||||||
|
setTimer(0);
|
||||||
|
wait(piero);
|
||||||
|
}
|
||||||
|
if(empty(codaPiero)){ // Se non è ancora arrivato il cliente, Piero si mette in attesa..
|
||||||
|
wait(cliente);
|
||||||
|
b--;
|
||||||
|
<Servi>
|
||||||
|
}
|
||||||
|
else{ // ..altrimenti lo serve e lo sveglia
|
||||||
|
b--;
|
||||||
|
<Servi>
|
||||||
|
signal(codaPiero);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void rosa(){
|
||||||
|
deveFriggere = true;
|
||||||
|
if(!empty(mario)){
|
||||||
|
signal(mario);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
wait(rosa);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void cliente(){
|
||||||
|
if(empty(cliente)) wait(codaPiero); // Se Piero non è ancora arrivato si mette in attesa..
|
||||||
|
else signal(cliente) // ..altrimenti sveglia Piero
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bomboloni alpha;
|
||||||
|
process piero(){
|
||||||
|
while(true){
|
||||||
|
alpha.piero();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process mario(){
|
||||||
|
while(true){
|
||||||
|
alpha.mario();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process rosa(){
|
||||||
|
while(true){
|
||||||
|
waitTimer()
|
||||||
|
alpha.rosa();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process cliente(){
|
||||||
|
alpha.cliente();
|
||||||
|
<Mangia>
|
||||||
|
}
|
|
@ -0,0 +1,76 @@
|
||||||
|
process vassoio{
|
||||||
|
int b = 0;
|
||||||
|
entry piero_rosa(in String inMess, out String outMess);
|
||||||
|
boolean attesaPiero = false;
|
||||||
|
|
||||||
|
call mario.friggi(b);
|
||||||
|
b = 30;
|
||||||
|
while(true){
|
||||||
|
accept piero_rosa(in String inMess, out String outMess)
|
||||||
|
{
|
||||||
|
if(inMess=="piero"){
|
||||||
|
b--;
|
||||||
|
if(b==0){
|
||||||
|
outMess = "finiti";
|
||||||
|
attesaPiero = true;
|
||||||
|
setTimer(0);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
outMess = "non finiti";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(inMess=="rosa"){
|
||||||
|
call mario.friggi(b);
|
||||||
|
b = 30;
|
||||||
|
if (attesaPiero) {
|
||||||
|
attesaPiero = false;
|
||||||
|
call Piero.riprendi();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process Mario{
|
||||||
|
entry friggi(in int b_rimasti);
|
||||||
|
|
||||||
|
while(true){
|
||||||
|
accept friggi(in int b_rim)
|
||||||
|
{
|
||||||
|
if(b_rim>0){
|
||||||
|
<butta>
|
||||||
|
}
|
||||||
|
<friggi>
|
||||||
|
setTimer(60);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process Piero{
|
||||||
|
entry cliente();
|
||||||
|
entry riprendi();
|
||||||
|
String mess;
|
||||||
|
|
||||||
|
while(true){
|
||||||
|
accept cliente() // Aspetta un cliente
|
||||||
|
{
|
||||||
|
call vassoio.piero_rosa("piero");
|
||||||
|
<servo clienti>
|
||||||
|
}
|
||||||
|
if (mess == "finiti") {
|
||||||
|
accept riprendi()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process Rosa{
|
||||||
|
while(true){
|
||||||
|
waitTimer();
|
||||||
|
call vassoio.piero_rosa("rosa");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process Cliente{
|
||||||
|
call Piero.cliente(); // Chiede a Piero un bombolone
|
||||||
|
<Mangia bombolone>
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
semaphore mario = 0;
|
||||||
|
semaphore cliente = 0;
|
||||||
|
semaphore mutex = 1;
|
||||||
|
semaphore rosa = 0;
|
||||||
|
semaphore ricevi = 0;
|
||||||
|
semaphore piero = 0;
|
||||||
|
int b = 0;
|
||||||
|
boolean attesaPiero = false;
|
||||||
|
|
||||||
|
process mario(){
|
||||||
|
<friggi>
|
||||||
|
b=30;
|
||||||
|
setTimer(60);
|
||||||
|
V(piero);
|
||||||
|
while(true){
|
||||||
|
P(mario);
|
||||||
|
if(b>0) <Butta>
|
||||||
|
<Friggi>
|
||||||
|
b=30;
|
||||||
|
setTimer(60);
|
||||||
|
if(attesaPiero){
|
||||||
|
attesaPiero = false;
|
||||||
|
V(piero);
|
||||||
|
}
|
||||||
|
V(rosa);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process piero(){
|
||||||
|
P(piero);
|
||||||
|
while(true){
|
||||||
|
P(cliente); // Aspetta la richiesta del cliente
|
||||||
|
P(mutex);
|
||||||
|
<Servi>
|
||||||
|
V(ricevi); // Sblocca il cliente
|
||||||
|
b--;
|
||||||
|
if(b==0){
|
||||||
|
attesaPiero = true;
|
||||||
|
setTimer(0);
|
||||||
|
V(mutex);
|
||||||
|
P(piero);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
V(mutex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process rosa(){
|
||||||
|
while(true){
|
||||||
|
waitTimer();
|
||||||
|
P(mutex);
|
||||||
|
V(mario);
|
||||||
|
P(rosa);
|
||||||
|
V(mutex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process cliente(){
|
||||||
|
V(cliente); // Richiede bombolone svegliando Piero
|
||||||
|
P(ricevi); // Aspetta di ricevere il bombolone da Piero
|
||||||
|
<Mangia bombolone>
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
Process Bancone {
|
||||||
|
int nbomb = 0;
|
||||||
|
long tick = 0;
|
||||||
|
long alarm = -1;
|
||||||
|
boolean butta = false;
|
||||||
|
signal s;
|
||||||
|
port signal friggi_i;
|
||||||
|
port signal friggi_f;
|
||||||
|
port signal servi_i;
|
||||||
|
port signal servi_f;
|
||||||
|
port signal wait_timer;
|
||||||
|
port long set_timer;
|
||||||
|
port signal scaduti;
|
||||||
|
|
||||||
|
do
|
||||||
|
[] nbomb == 0 or butta; p = receive(s) from friggi_i ->
|
||||||
|
send(s) to p.ok;
|
||||||
|
|
||||||
|
[] ; receive(s) from friggi_f
|
|
@ -0,0 +1,73 @@
|
||||||
|
Process Bancone {
|
||||||
|
int nbomb = 0;
|
||||||
|
long tick = 0, alarm = -1;
|
||||||
|
bool butta = false;
|
||||||
|
entry friggi_i;
|
||||||
|
entry friggi_f;
|
||||||
|
entry servi_cliente_i;
|
||||||
|
entry servi_cliente_f;
|
||||||
|
entry scaduti;
|
||||||
|
entry clock;
|
||||||
|
entry wait_timer;
|
||||||
|
entry set_timer (in long n);
|
||||||
|
|
||||||
|
do
|
||||||
|
[] nbomb == 0 or butta; accept friggi_i();
|
||||||
|
|
||||||
|
[] ; accept friggi_f() ->
|
||||||
|
nbomb = 30;
|
||||||
|
alarm = tick + minuti(60);
|
||||||
|
butta = false;
|
||||||
|
|
||||||
|
[] nbomb > 0 and !butta; accept servi_cliente_i();
|
||||||
|
|
||||||
|
[] ; accept servi_cliente_f() ->
|
||||||
|
nbomb--;
|
||||||
|
|
||||||
|
[] ; accept clock(); ->
|
||||||
|
tick++;
|
||||||
|
|
||||||
|
[] tick >= alarm and alarm != -1; accept wait_timer() ->
|
||||||
|
butta = true;
|
||||||
|
nbomb = 0;
|
||||||
|
alarm = -1;
|
||||||
|
|
||||||
|
[] ; accept set_timer(in long n) ->
|
||||||
|
alarm = tick + n;
|
||||||
|
|
||||||
|
[] ; accept scaduti ->
|
||||||
|
butta = true;
|
||||||
|
od;
|
||||||
|
}
|
||||||
|
|
||||||
|
Process Mario {
|
||||||
|
while(true){
|
||||||
|
call Bancone.friggi_i();
|
||||||
|
< friggi bomboloni >
|
||||||
|
call Bancone.friggi_f();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Process Piero {
|
||||||
|
while(true){
|
||||||
|
call Bancone.servi_cliente_i();
|
||||||
|
< servi cliente >
|
||||||
|
call Bancone.servi_cliente_f();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Process Rosa {
|
||||||
|
while(true){
|
||||||
|
call Bancone.wait_timer();
|
||||||
|
call Bancone.butta();
|
||||||
|
< butta >
|
||||||
|
call Bancone.set_timer(60);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Process Clock {
|
||||||
|
while(true){
|
||||||
|
< hardware clock ticks >
|
||||||
|
call Bancone.clock();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,119 @@
|
||||||
|
process vassoio{
|
||||||
|
int b = 0;
|
||||||
|
port String piero_rosa;
|
||||||
|
String mess;
|
||||||
|
port signal rilascio_vassoio;
|
||||||
|
signal s;
|
||||||
|
process p;
|
||||||
|
boolean attesaPiero = false;
|
||||||
|
|
||||||
|
send(b) to mario.friggi;
|
||||||
|
p = receive(s) from rilascio_vassoio;
|
||||||
|
b = 30;
|
||||||
|
while(true){
|
||||||
|
p = receive(mess) from piero_rosa;
|
||||||
|
if(mess=="piero"){
|
||||||
|
b--;
|
||||||
|
if(b==0){
|
||||||
|
attesaPiero = true;
|
||||||
|
send("finiti") to p.servi;
|
||||||
|
send(0) to clock.setTimer;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
send("non finiti") to p.servi;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(mess=="rosa"){
|
||||||
|
send(b) to mario.friggi;
|
||||||
|
p = receive(s) from rilascio_vassoio;
|
||||||
|
b = 30;
|
||||||
|
send(s) to rosa.rilascio_rosa;
|
||||||
|
if(attesaPiero){
|
||||||
|
attesaPiero = false;
|
||||||
|
send(s) to Piero.riprendi;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process Mario{
|
||||||
|
process p;
|
||||||
|
signal s;
|
||||||
|
port int friggi;
|
||||||
|
int b_rim;
|
||||||
|
while(true){
|
||||||
|
p = receive(b_rim) from friggi;
|
||||||
|
if(b_rim>0)
|
||||||
|
<butta>
|
||||||
|
<friggi>
|
||||||
|
send(60) to clock.setTimer;
|
||||||
|
send(s) to p.rilascio_vassoio;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process Piero{
|
||||||
|
process p;
|
||||||
|
port signal riprendi;
|
||||||
|
signal s;
|
||||||
|
port String servi;
|
||||||
|
String mess;
|
||||||
|
while(true){
|
||||||
|
<attendi clienti>
|
||||||
|
send("piero") to vassoio.piero_rosa;
|
||||||
|
p = receive(mess) from servi;
|
||||||
|
<servo cliente>
|
||||||
|
if(mess == "finiti"){
|
||||||
|
p = receive(s) from riprendi;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process Rosa{
|
||||||
|
port signal rilascio_rosa;
|
||||||
|
signal s;
|
||||||
|
process p;
|
||||||
|
while(true){
|
||||||
|
send(s) to clock.waitTimer;
|
||||||
|
p = receive(s) from rilascio_rosa;
|
||||||
|
send("rosa") to vassoio.piero_rosa;
|
||||||
|
p = receive(s) from rilascio_rosa;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process Clock{
|
||||||
|
port Signal waitTimer;
|
||||||
|
port int setTimer;
|
||||||
|
port Signal tick;
|
||||||
|
signal s;
|
||||||
|
process p;
|
||||||
|
int min;
|
||||||
|
int tempo = 0;
|
||||||
|
int sveglia = 0;
|
||||||
|
boolean inAscolto = false;
|
||||||
|
do
|
||||||
|
[] p = receive(s) from tick; -> // Aumenta il tempo e se il timer scade..
|
||||||
|
tempo++;
|
||||||
|
if(sveglia == tempo && inAscolto){ // ..se il tempo è uguale alla sveglia e Rosa è sulla receive...
|
||||||
|
inAscolto = false;
|
||||||
|
send(s) to rosa.rilascio_rosa; // ..allora sveglia Rosa
|
||||||
|
sveglia = 0;
|
||||||
|
}
|
||||||
|
[] p = receive(min) from setTimer; -> // Viene settato il Timer a zero o a 60
|
||||||
|
sveglia = tempo + min;
|
||||||
|
if(sveglia == tempo && inAscolto){ // Se il tempo è uguale alla sveglia e Rosa è sulla receive...
|
||||||
|
inAscolto = false;
|
||||||
|
send(s) to rose.rilascio_rosa; // ..llora sveglia Rosa
|
||||||
|
sveglia = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
[] p = receive(s) from waitTimer; -> // Si mette Rosa sulla receive accettando la send di waitTimer
|
||||||
|
inAscolto = true;
|
||||||
|
od
|
||||||
|
}
|
||||||
|
process Tempo{
|
||||||
|
signal s;
|
||||||
|
while(true){
|
||||||
|
<aspetta un secondo>
|
||||||
|
send(s) to clock.tick;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,95 @@
|
||||||
|
monitor Clock{
|
||||||
|
condition attesa;
|
||||||
|
int tempo = <tempo di inizializzazione>;
|
||||||
|
int sveglia = 0;
|
||||||
|
|
||||||
|
public void tick(){ // Funzione che incrementa il tempo e controlla se deve svegliare Rosa
|
||||||
|
time++;
|
||||||
|
if(tempo==sveglia){
|
||||||
|
signal(attesa); // Sveglia Rosa dalla waitTimer()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void waitTimer(){
|
||||||
|
wait(attesa);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTimer(int min){
|
||||||
|
if(min == 0){ // Se Piero ha fatto una setTimer(0)..
|
||||||
|
signal(attesa); // ..allora sveglio Rosa dalla waitTimer()
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
sveglia = tempo + min; // Altrimenti setto normalmente la sveglia
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
monitor bomboloni{
|
||||||
|
int b = 0;
|
||||||
|
condition mario;
|
||||||
|
condition piero;
|
||||||
|
condition cliente;
|
||||||
|
condition rosa;
|
||||||
|
boolean deveFriggere = false;
|
||||||
|
|
||||||
|
public void mario(){
|
||||||
|
if (!deveFriggere) wait(mario);
|
||||||
|
if(b>0) <butta i bomboloni>
|
||||||
|
<friggi bomboloni>
|
||||||
|
deveFriggere = false;
|
||||||
|
b=30;
|
||||||
|
clock.setTimer(60);
|
||||||
|
signal(piero);
|
||||||
|
if(!empty(rosa))signal(rosa);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void piero(){
|
||||||
|
if (b == 0){
|
||||||
|
clock.setTimer(0);
|
||||||
|
wait(piero);
|
||||||
|
}
|
||||||
|
wait(cliente);
|
||||||
|
b--;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void rosa(){
|
||||||
|
deveFriggere = true;
|
||||||
|
if(!empty(mario)){
|
||||||
|
signal(mario);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
wait(rosa);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Bomboloni alpha;
|
||||||
|
Clock clock;
|
||||||
|
|
||||||
|
process piero(){
|
||||||
|
while(true){
|
||||||
|
alpha.piero();
|
||||||
|
<Servi>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process mario(){
|
||||||
|
while(true){
|
||||||
|
alpha.mario();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process rosa(){
|
||||||
|
while(true){
|
||||||
|
clock.waitTimer()
|
||||||
|
alpha.rosa();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process Tempo{
|
||||||
|
while(true){
|
||||||
|
<"aspetta un secondcondo">
|
||||||
|
clock.tick();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,95 @@
|
||||||
|
process vassoio{
|
||||||
|
int b = 0;
|
||||||
|
boolean attesaPiero = false;
|
||||||
|
entry piero_rosa(in String inMess, out String outMess);
|
||||||
|
|
||||||
|
call mario.friggi(b);
|
||||||
|
b = 30;
|
||||||
|
while(true){
|
||||||
|
accept piero_rosa(in String inMess, out String outMess)
|
||||||
|
{
|
||||||
|
if(inMess=="piero"){
|
||||||
|
b--;
|
||||||
|
if(b==0){
|
||||||
|
outMess = "finiti";
|
||||||
|
attesaPiero = true;
|
||||||
|
call clock.setTimer(0);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
outMess = "non finiti";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(inMess=="rosa"){
|
||||||
|
call mario.friggi(b);
|
||||||
|
b = 30;
|
||||||
|
if (attesaPiero) {
|
||||||
|
attesaPiero = false;
|
||||||
|
call Piero.riprendi();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process Mario{
|
||||||
|
entry friggi(in int b_rimasti);
|
||||||
|
while(true){
|
||||||
|
accept friggi(in int b_rim)
|
||||||
|
{
|
||||||
|
if(b_rim>0)
|
||||||
|
<butta>
|
||||||
|
<friggi>
|
||||||
|
call clock.setTimer(60);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process Piero{
|
||||||
|
entry riprendi();
|
||||||
|
String mess;
|
||||||
|
|
||||||
|
while(true){
|
||||||
|
<attendi clienti>
|
||||||
|
call vassoio.piero_rosa("piero");
|
||||||
|
<servo cliente>
|
||||||
|
if (mess == "finiti") {
|
||||||
|
accept riprendi()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process Rosa{
|
||||||
|
while(true){
|
||||||
|
call clock.waitTimer();
|
||||||
|
call vassoio.piero_rosa("rosa");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
process Clock{
|
||||||
|
entry waitTimer();
|
||||||
|
entry setTimer(in int min);
|
||||||
|
entry tick;
|
||||||
|
int tempo = 0;
|
||||||
|
int sveglia = 0;
|
||||||
|
do
|
||||||
|
[] accept tick -> tempo++; // Incrementa il tempo
|
||||||
|
[] accept setTimer(in int min)
|
||||||
|
{
|
||||||
|
if(min == 0){ // Se Piero ha fatto una setTimer(0)..
|
||||||
|
accept waitTimer() // ..allora sveglio Rosa dalla waitTimer()
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
sveglia = tempo + min; // Altrimenti setto normalmente la sveglia
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[](tempo == sveglia); accept waitTimer() // Se è il momento di svegliare Rosa accettiamo la sua call
|
||||||
|
od
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
process Tempo{
|
||||||
|
while(true){
|
||||||
|
<aspetta un secondo>
|
||||||
|
call clock.tick;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue