ProvaTeoria 2009.01.30

From Sistemi Operativi
Jump to navigation Jump to search

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