giorno prima

This commit is contained in:
Francesco Mecca 2018-12-03 17:53:23 +01:00
parent 233233ee43
commit 0a7668d13f
13 changed files with 986 additions and 0 deletions

View file

@ -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
}
}

View file

@ -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;
}
}

View file

@ -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
}
}

View file

@ -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);
}
}

View file

@ -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
}

View file

@ -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>
}

View file

@ -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>
}

View file

@ -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>
}

View file

@ -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

View file

@ -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();
}
}

View file

@ -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;
}
}

View file

@ -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();
}
}

View file

@ -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;
}
}