/* * Class Mailbox * * This software is developed for Choral devices with Java. * Copyright Choral srl. All Rights reserved. */ package general; /** * Producer/consumer model on multiple buffer, mailbox as monitor, * protection is related to the inclusion of entry methods * * @version 1.00 <BR> <i>Last update</i>: 01-08-2007 * @author alessioza * */ public class Mailbox extends Monitor { /* * variables */ private Condition spaceAval = new Condition(); // available space private Condition dataAval = new Condition(); // available data private Object data[]; // data buffer private int numEl, numData=0, head=0, tail=0; // item number, data number, where to read, where to write /* * constructors */ public Mailbox(int n) { // constructor with n items buffer numEl = n; data = new Object[numEl]; } /* * methods */ public Object read() { mEnter(); // prologue if (numData==0) dataAval.cWait(); // if no data Object ret = data[head]; data[head] = null; head = (++head) % numEl; numData--; spaceAval.cSignal(); // notify available space mExit(); // epilogue return ret; } //read public void write (Object d) { mEnter(); // prologue if (numData == numEl) spaceAval.cWait(); // non c'รจ spazio data[tail] = d; tail = (++tail) % numEl; numData++; dataAval.cSignal(); // notify available data mExit(); // epilogue } //write public int numMsg() { // number of messages in the Mailbox return numData; } //size public int dimens() { // Mailbox size (number of messages) return numEl; } //dimens } //Mailbox