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

# Line 410 | Line 410 | public class LinkedTransferQueue<E> exte
410           */
411          final boolean isMatched() {
412              Object x = item;
413 <            return x == this || (x != null) != isData;
413 >            return (x == this) || ((x == null) == isData);
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          /**
# 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