/** FILE: buffermy.java **/ package BUFFER; // Referenced classes of package BUFFER: // buffer, accex, sala /* * Gestione Personalizzata con tolleranza... * * la get è in assenza di politica, * la put si comporta anarchicamente fino a quando il processo che è in testa alla lista non ha * aspettato per tolleranza eventi. Allora tutti i nuovi processi si mettono in coda fino a quando * il primo non è passato. Se il primo elemento non è in situazione critica possono i processi nella * lista possono uscire liberamente. */ public class buffermy extends buffer { public buffermy(int i) { getcorrente = 1; getinfila = 1; blocco = false; testa = new sala(); coda = testa; tolleranza = i; } public synchronized void put(String s) throws InterruptedException { accex accex1 = accput; // nuovo oggetto assegnato al thread per memorizzare gli accessi accex1.next = new accex(); accex1.acc1 = accessi++; // QUI incremento accessi == gli EVENTI accput = accput.next; sala sala1 = null; // attendi fino a quando entri nel buffer oppure se è attuato il blocco e non sei in testa alla lista, while (liberi < s.length() || blocco && testa != sala1) { if(sala1 == null) { sala1 = coda; // nuovo oggetto assegnato al thread per la lista di attesa coda.next = new sala(); coda = coda.next; sala1.evento = accessi - 1; coda.pred = sala1; } wait(); } if(sala1 != null) // se è passato un processo che era il lista if(testa == sala1) // se è il processo in testa { testa = testa.next; // taglia in testa testa.pred = null; } else if(coda == sala1) // se è passato un processo che era in coda alla lista { coda = coda.pred; // taglia in coda coda.next = null; } else // se è passato un processo che è in mezzo alla lista { sala1.pred.next = sala1.next; // taglia al centro sala1.next.pred = sala1.pred; } if(accessi - testa.evento > tolleranza) // controllo se in testa c'è un processo che ha atteso troppo blocco = true; // politica in corso else blocco = false; // ritorno a politica pseudo-anarchica accex1.acc2 = accessi; notifyAll(); super.put(s); // scrittura sul buffer --> vedi buffer.java } public synchronized String get() throws InterruptedException { accex accex1 = accget; // nuovo oggetto assegnato al thread per memorizzare gli accessi accex1.next = new accex(); accex1.acc1 = accessi++; // QUI incremento accessi == gli EVENTI accget = accget.next; while(liberi == 200) wait(); accex1.acc2 = accessi; if(accessi - testa.evento > tolleranza) blocco = true; else blocco = false; notifyAll(); return super.get(); } int getcorrente; int getinfila; boolean blocco; sala testa; sala coda; private int tolleranza; }