// soluzione esercizio c.2 fatta del prof Davoli
/*in rcv si fa un ciclo. Ci sono due casi
  1) un msg uguale al precedente allora si elimina il messaggio arrivato prima
  2) non è stato ricevuto prima allora lo si aggiunge alla lista

  struttura dati ESTERNA (static) per avere struttura dati comune tra piu CHIAMATE
*/

L : list of T

void tsend(msg_t msg, pid_t dest):
    asend(msg, dest)
    
msg_t trecv(void)
  while True:
    msg = arecv(ANY);
    if msg in L:
      L.delete(msg)
      return msg
    else:
      L.add(msg)
      
//Sì, hanno lo stesso potere espressivo,
//infatti si può anche implementare il msg passing asincrono dato quello testardo:

buf: msgbuffer
      
asend(msg_t msg, pid_t dest):
  tsend((getpid(), msg), dest)
  tsend((getpid(), msg), dest)
 
msg_t arecv(sender):
  while ((msg = buf.get(sender))  == NULL)
    (id, m) = trecv()
    buf.add(id,m)
  return msg