--- jsr166/src/jsr166y/LinkedTransferQueue.java 2009/07/29 02:19:56 1.32 +++ jsr166/src/jsr166y/LinkedTransferQueue.java 2009/07/30 13:30:19 1.33 @@ -635,7 +635,6 @@ public class LinkedTransferQueue exte } } - public Iterator iterator() { return new Itr(); } @@ -650,42 +649,39 @@ public class LinkedTransferQueue exte class Itr implements Iterator { Node next; // node to return next Node pnext; // predecessor of next - Node snext; // successor of next Node curr; // last returned node, for remove() Node pcurr; // predecessor of curr, for remove() - E nextItem; // Cache of next item, once committed to in next + E nextItem; // Cache of next item, once committed to in next Itr() { - findNext(); + advance(); } /** - * Ensures next points to next valid node, or null if none. + * Moves to next valid node and returns item to return for + * next(), or null if no such. */ - void findNext() { + private E advance() { + pcurr = pnext; + curr = next; + E item = nextItem; + for (;;) { - Node pred = pnext; - Node q = next; - if (pred == null || pred == q) { - pred = traversalHead(); - q = pred.next; - } - if (q == null || !q.isData) { + pnext = next == null ? traversalHead() : next; + next = pnext.next; + if (next == pnext) { next = null; - return; + continue; // restart } - Object x = q.get(); - Node s = q.next; - if (x != null && q != x && q != s) { + if (next == null) + break; + Object x = next.get(); + if (x != null && x != next) { nextItem = (E) x; - snext = s; - pnext = pred; - next = q; - return; + break; } - pnext = q; - next = s; } + return item; } public boolean hasNext() { @@ -693,14 +689,9 @@ public class LinkedTransferQueue exte } public E next() { - if (next == null) throw new NoSuchElementException(); - pcurr = pnext; - curr = next; - pnext = next; - next = snext; - E x = nextItem; - findNext(); - return x; + if (next == null) + throw new NoSuchElementException(); + return advance(); } public void remove() { @@ -770,32 +761,44 @@ public class LinkedTransferQueue exte * @return the number of elements in this queue */ public int size() { - int count = 0; - Node h = traversalHead(); - for (Node p = h.next; p != null && p.isData; p = p.next) { - Object x = p.get(); - if (x != null && x != p) { - if (++count == Integer.MAX_VALUE) // saturated + for (;;) { + int count = 0; + Node pred = traversalHead(); + for (;;) { + Node q = pred.next; + if (q == pred) // restart break; + if (q == null || !q.isData) + return count; + Object x = q.get(); + if (x != null && x != q) { + if (++count == Integer.MAX_VALUE) // saturated + return count; + } + pred = q; } } - return count; } public int getWaitingConsumerCount() { - int count = 0; - Node h = traversalHead(); - for (Node p = h.next; p != null && !p.isData; p = p.next) { - if (p.get() == null) { - if (++count == Integer.MAX_VALUE) + // converse of size -- count valid non-data nodes + for (;;) { + int count = 0; + Node pred = traversalHead(); + for (;;) { + Node q = pred.next; + if (q == pred) // restart break; + if (q == null || q.isData) + return count; + Object x = q.get(); + if (x == null) { + if (++count == Integer.MAX_VALUE) // saturated + return count; + } + pred = q; } } - return count; - } - - public int remainingCapacity() { - return Integer.MAX_VALUE; } public boolean remove(Object o) { @@ -805,10 +808,10 @@ public class LinkedTransferQueue exte Node pred = traversalHead(); for (;;) { Node q = pred.next; - if (q == null || !q.isData) - return false; if (q == pred) // restart break; + if (q == null || !q.isData) + return false; Object x = q.get(); if (x != null && x != q && o.equals(x) && q.compareAndSet(x, q)) { @@ -820,6 +823,10 @@ public class LinkedTransferQueue exte } } + public int remainingCapacity() { + return Integer.MAX_VALUE; + } + /** * Save the state to a stream (that is, serialize it). *