ProvaTeoria 2009.01.30
Revision as of 13:07, 5 May 2014 by Stefano 92 (talk | contribs) (Created page with "=[http://www.cs.unibo.it/~renzo/so/compiti/2009-01-30.tot.pdf TESTO COMPITO]= ==Esercizio 1== <syntaxhighlight lang="C"> /* Esercizio 1: Scrivere un monitor sbb che implement...")
TESTO COMPITO
Esercizio 1
/*
Esercizio 1: Scrivere un monitor sbb che implementi un buffer limitato di caratteri.
Il monitor deve implmementare le seguenti procedure entry:
int sbb.enqueue(char *s);
int sbb.dequeue(char *buf, len l);
Il buffer contiene MAX caratteri. Le stringhe passate alla enqueue sono classiche stringhe del linguaggio C con il carattere
nullo come terminatore e devono avere lunghezza minore di MAX. Nel caso la stringa s abbia lunghezza maggiore o
uguale a MAX la stringa non viene caricata nel buffer. Il valore di ritorno e' la lunghezza della stringa inserita nel buffer, -1
in caso di errore.
La dequeue deve restituire una stringa alla volta scrivendola nel buffer. Il parametro l contiene l'ampiezza del buffer (in
byte in modo simile alla system call "read").
Se la stringa non puo' essere memorizzata interamente nel buffer perche' il buffer e' di lunghezza insufficiente viene
tornato un errore (-1), in modo che il processo chiamante provveda a chiamare nuovamente la funzione specificando un
buffer di ampiezza maggiore. (N.B. In caso di errore di buffer insufficiente la stringa non deve essere perduta!).
Il valore di ritorno e' la lunghezza effettiva della stringa presa dal buffer.
*/
struct attesa_t
{
int mySize;
condition oktowrite;
}
monitor sbb
{
attesa_t * coda_w=queue()
int size=0;
char **buffer=NULL;
procedure entry int enqueue(char*s)
{
int need=strlen(s);
if (need>MAX)
return -1; //ho specificato una stringa troppo lunga che non potrà mai essere inserita.
else if (MAX-size < need) //non c'è spazio per scrivere: attendo che si liberi
coda_w.enqueue(need).wait();
insert(buffer,s); //scrivo nel buffer la mia stringa s
return need;
}
procedure entry int dequeue(char*buf,len l)
{
if (isEmpty(buffer))
oktoread.wait(); //buffer vuoto: aspetto che ci sia un elemento.
if (strlen(head(buffer))>l)
return -1; //spazio insufficiente: aspetto che si liberi. Nel frattempo per evitare la perdita della stringa non faccio signal
else
{
buf=dequeue(buffer); //prelevo la mia stringa e la metto nel buffer
if (!isEmpty(buffer))
oktoread.signal(); //buffer non vuoto: sveglio un lettore
while(ris!=-1)
(searchFor(MAX-size)).signal(); //se c'è spazio per far scrivere qualcuno, lo risveglio.
//la searchFor() prende in input un intero n e cerca il primo scrittore
//in coda che voglia scrivere meno di n byte. L'operazione continua finché
//non ci sono più scrittori disponibili (return -1)
return strlen(buf);
}
}
}
-stefano92