package ibis.ipl.impl.stacking.lrmc.util; // import ibis.util.Timer; public class MessageQueue { private final int limit; private Message head; private Message tail; private int size = 0; private boolean finish = false; // Timer enqueueTimer = Timer.createTimer(); public MessageQueue() { // no limit... this(Integer.MAX_VALUE); } public MessageQueue(int limit) { this.limit = limit; } public synchronized void terminate() { finish = true; // System.out.println("lrmc: wait " + enqueueTimer.nrTimes() // + " times, total " + Timer.format(enqueueTimer.totalTimeVal())); notifyAll(); } public synchronized int size() { return size; } public synchronized void enqueue(Message m) { while (!finish && size >= limit) { // enqueueTimer.start(); try { wait(); } catch (Exception e) { // Ignored // } finally { // enqueueTimer.stop(); } } if (finish) { return; } if (head == null) { head = tail = m; m.next = null; notifyAll(); } else { tail.next = m; tail = m; } size++; // System.err.println("enqueue, q size = " + size); } public synchronized Message dequeue() { while (size == 0 && !finish) { try { wait(); } catch (Exception e) { // Ignored } } if (finish) { return null; } Message tmp = head; head = head.next; tmp.next = null; size--; // System.err.println("dequeue, q size = " + size); if (size == limit - 1) { notifyAll(); } return tmp; } }