--- jsr166/src/jsr166y/LinkedTransferQueue.java 2009/10/28 09:28:30 1.57 +++ jsr166/src/jsr166y/LinkedTransferQueue.java 2009/10/28 10:23:38 1.58 @@ -414,6 +414,13 @@ public class LinkedTransferQueue exte } /** + * Returns true if this is an unmatched request node. + */ + final boolean isUnmatchedRequest() { + return !isData && item == null; + } + + /** * Returns true if a node with the given mode cannot be * appended to this node because this node is unmatched and * has opposite data mode. @@ -428,6 +435,7 @@ public class LinkedTransferQueue exte * Tries to artificially match a data node -- used by remove. */ final boolean tryMatchData() { + assert isData; Object x = item; if (x != null && x != this && casItem(x, null)) { LockSupport.unpark(waiter); @@ -779,7 +787,7 @@ public class LinkedTransferQueue exte Node p = lastRet; if (p == null) throw new IllegalStateException(); lastRet = null; - findAndRemoveNode(p); + findAndRemoveDataNode(p); } } @@ -855,18 +863,17 @@ public class LinkedTransferQueue exte /** * Main implementation of Iterator.remove(). Find - * and unsplice the given node. + * and unsplice the given data node. */ - final void findAndRemoveNode(Node s) { + final void findAndRemoveDataNode(Node s) { + assert s.isData; if (s.tryMatchData()) { - Node pred = null; - Node p = head; - while (p != null) { + for (Node pred = null, p = head; p != null; ) { if (p == s) { unsplice(pred, p); break; } - if (!p.isData && !p.isMatched()) + if (p.isUnmatchedRequest()) break; pred = p; if ((p = p.next) == pred) { // stale @@ -882,9 +889,7 @@ public class LinkedTransferQueue exte */ private boolean findAndRemove(Object e) { if (e != null) { - Node pred = null; - Node p = head; - while (p != null) { + for (Node pred = null, p = head; p != null; ) { Object item = p.item; if (p.isData) { if (item != null && item != p && e.equals(item) && @@ -896,7 +901,7 @@ public class LinkedTransferQueue exte else if (item == null) break; pred = p; - if ((p = p.next) == pred) { + if ((p = p.next) == pred) { // stale pred = null; p = head; }