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.57 by jsr166, Wed Oct 28 09:28:30 2009 UTC vs.
Revision 1.59 by jsr166, Thu Oct 29 00:29:16 2009 UTC

# Line 414 | Line 414 | public class LinkedTransferQueue<E> exte
414          }
415  
416          /**
417 +         * Returns true if this is an unmatched request node.
418 +         */
419 +        final boolean isUnmatchedRequest() {
420 +            return !isData && item == null;
421 +        }
422 +
423 +        /**
424           * Returns true if a node with the given mode cannot be
425           * appended to this node because this node is unmatched and
426           * has opposite data mode.
# Line 428 | Line 435 | public class LinkedTransferQueue<E> exte
435           * Tries to artificially match a data node -- used by remove.
436           */
437          final boolean tryMatchData() {
438 +            assert isData;
439              Object x = item;
440              if (x != null && x != this && casItem(x, null)) {
441                  LockSupport.unpark(waiter);
# Line 779 | Line 787 | public class LinkedTransferQueue<E> exte
787              Node<E> p = lastRet;
788              if (p == null) throw new IllegalStateException();
789              lastRet = null;
790 <            findAndRemoveNode(p);
790 >            findAndRemoveDataNode(p);
791          }
792      }
793  
# Line 813 | Line 821 | public class LinkedTransferQueue<E> exte
821                      break;
822                  }
823                  if (oldpred == pred ||      // Already saved
824 <                    (oldpred == null && casCleanMe(null, pred)))
825 <                    break;                  // Postpone cleaning
824 >                    ((oldpred == null || oldpred.next == s) &&
825 >                     casCleanMe(oldpred, pred))) {
826 >                    break;
827 >                }
828              }
829          }
830      }
# Line 855 | Line 865 | public class LinkedTransferQueue<E> exte
865  
866      /**
867       * Main implementation of Iterator.remove(). Find
868 <     * and unsplice the given node.
868 >     * and unsplice the given data node.
869       */
870 <    final void findAndRemoveNode(Node<E> s) {
870 >    final void findAndRemoveDataNode(Node<E> s) {
871 >        assert s.isData;
872          if (s.tryMatchData()) {
873 <            Node<E> pred = null;
863 <            Node<E> p = head;
864 <            while (p != null) {
873 >            for (Node<E> pred = null, p = head; p != null; ) {
874                  if (p == s) {
875                      unsplice(pred, p);
876                      break;
877                  }
878 <                if (!p.isData && !p.isMatched())
878 >                if (p.isUnmatchedRequest())
879                      break;
880                  pred = p;
881                  if ((p = p.next) == pred) { // stale
# Line 882 | Line 891 | public class LinkedTransferQueue<E> exte
891       */
892      private boolean findAndRemove(Object e) {
893          if (e != null) {
894 <            Node<E> pred = null;
886 <            Node<E> p = head;
887 <            while (p != null) {
894 >            for (Node<E> pred = null, p = head; p != null; ) {
895                  Object item = p.item;
896                  if (p.isData) {
897                      if (item != null && item != p && e.equals(item) &&
# Line 896 | Line 903 | public class LinkedTransferQueue<E> exte
903                  else if (item == null)
904                      break;
905                  pred = p;
906 <                if ((p = p.next) == pred) {
906 >                if ((p = p.next) == pred) { // stale
907                      pred = null;
908                      p = head;
909                  }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines