//ricevimento 2023 07 05 (luglio)
//proposta da Libera e controllata dal prof

//questa proposta era già su wiki a questo link:
// https://so.v2.cs.unibo.it/wiki/index.php/Prove_scritte_2017#Esercizio_c.2_.28da_controllare.29_2

//il messaggio mandato è la tripla <destinatario, mittente, messaggio>

asend(pid_t dst, msg_type msg){
	bsend (<dst, getpid(), msg>);
}

myDictionaryQueue of <pid_t, msg_type> db; //nota: salvo qui solo se il messaggio è per me, quindi dest non mi serve

arecv(pid_t sender) {

	//devo controllare se nella db ho già ricevuto il messaggio da quel mittente, ovvero mentre aspettavo un messaggio da qualcun'altro
	//db.get(sender) cerca una coppia il cui mittente è sender
	//se trova il messaggio lo rimuove anche dal db.
	//db.get(ANY) ritorna (ed elimina da db) il primo che trova (FIFO), e if(db.isEmpty()) return NULL;

	if( ( <mit, msg> = db.get(sender) ) != NULL ) //se lo trova
		return msg;

	do {
		<dst, mit, msg> = brecv(*);				//ricevo
		if( dst == getpid() ) {					//il messaggio è per me?
			if ( mit == sender || sender == ANY )		//se devo ritornare il messaggio
				return msg;     //esci dal while

			//se devo salvarlo (sender specificato e messaggio per me)
			//metto in db i messaggi di altri mittenti, ricevuti quando ne aspettavo uno da un mittente specificato

			db.add(<mit, msg>);
		}
		//se il messaggio non era per me non devo farci niente, quindi lo butto via!
	} while ( true ) //devo uscire solo con il return
}