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

Comparing jsr166/src/main/java/util/concurrent/LinkedTransferQueue.java (file contents):
Revision 1.12 by jsr166, Thu Oct 29 00:34:48 2009 UTC vs.
Revision 1.13 by jsr166, Fri Oct 30 18:35:22 2009 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines