--- jsr166/src/jsr166y/LinkedTransferQueue.java 2009/11/15 02:00:26 1.69 +++ jsr166/src/jsr166y/LinkedTransferQueue.java 2010/04/05 15:50:51 1.72 @@ -876,17 +876,18 @@ public class LinkedTransferQueue exte } /** - * Unlink matched nodes encountered in a traversal from head + * Unlinks matched nodes encountered in a traversal from head. */ private void sweep() { - Node p = head, s, n; - while (p != null && (s = p.next) != null && (n = s.next) != null) { - if (p == s || s == n) - p = head; // stale - else if (s.isMatched()) - p.casNext(s, n); - else + for (Node p = head, s, n; p != null && (s = p.next) != null; ) { + if (p == s) // stale + p = head; + else if (!s.isMatched()) p = s; + else if ((n = s.next) == null) // trailing node is pinned + break; + else + p.casNext(s, n); } } @@ -1124,7 +1125,11 @@ public class LinkedTransferQueue exte * @return {@code true} if this queue contains no elements */ public boolean isEmpty() { - return firstOfMode(true) == null; + for (Node p = head; p != null; p = succ(p)) { + if (!p.isMatched()) + return !p.isData; + } + return true; } public boolean hasWaitingConsumer() {