ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/jsr166y/LinkedTransferQueue.java
(Generate patch)

Comparing jsr166/src/jsr166y/LinkedTransferQueue.java (file contents):
Revision 1.59 by jsr166, Thu Oct 29 00:29:16 2009 UTC vs.
Revision 1.60 by dl, Fri Oct 30 12:06:31 2009 UTC

# Line 741 | Line 741 | public class LinkedTransferQueue<E> exte
741          private Node<E> nextNode;   // next node to return item for
742          private E nextItem;         // the corresponding item
743          private Node<E> lastRet;    // last returned node, to support remove
744 +        private Node<E> lastPred;   // predecessor to unlink lastRet
745  
746          /**
747           * Moves to next node after prev, or first node if prev null.
748           */
749          private void advance(Node<E> prev) {
750 +            lastPred = lastRet;
751              lastRet = prev;
752              Node<E> p;
753              if (prev == null || (p = prev.next) == prev)
# Line 786 | Line 788 | public class LinkedTransferQueue<E> exte
788          public final void remove() {
789              Node<E> p = lastRet;
790              if (p == null) throw new IllegalStateException();
791 <            lastRet = null;
790 <            findAndRemoveDataNode(p);
791 >            findAndRemoveDataNode(lastPred, p);
792          }
793      }
794  
# Line 866 | Line 867 | public class LinkedTransferQueue<E> exte
867      /**
868       * Main implementation of Iterator.remove(). Find
869       * and unsplice the given data node.
870 +     * @param possiblePred possible predecessor of s
871 +     * @param s the node to remove
872       */
873 <    final void findAndRemoveDataNode(Node<E> s) {
873 >    final void findAndRemoveDataNode(Node<E> possiblePred, Node<E> s) {
874          assert s.isData;
875          if (s.tryMatchData()) {
876 <            for (Node<E> pred = null, p = head; p != null; ) {
877 <                if (p == s) {
878 <                    unsplice(pred, p);
879 <                    break;
880 <                }
881 <                if (p.isUnmatchedRequest())
882 <                    break;
883 <                pred = p;
884 <                if ((p = p.next) == pred) { // stale
885 <                    pred = null;
886 <                    p = head;
876 >            if (possiblePred != null && possiblePred.next == s)
877 >                unsplice(possiblePred, s); // was actual predecessor
878 >            else {
879 >                for (Node<E> pred = null, p = head; p != null; ) {
880 >                    if (p == s) {
881 >                        unsplice(pred, p);
882 >                        break;
883 >                    }
884 >                    if (p.isUnmatchedRequest())
885 >                        break;
886 >                    pred = p;
887 >                    if ((p = p.next) == pred) { // stale
888 >                        pred = null;
889 >                        p = head;
890 >                    }
891                  }
892              }
893          }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines