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.58 by jsr166, Wed Oct 28 10:23:38 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 855 | Line 863 | public class LinkedTransferQueue<E> exte
863  
864      /**
865       * Main implementation of Iterator.remove(). Find
866 <     * and unsplice the given node.
866 >     * and unsplice the given data node.
867       */
868 <    final void findAndRemoveNode(Node<E> s) {
868 >    final void findAndRemoveDataNode(Node<E> s) {
869 >        assert s.isData;
870          if (s.tryMatchData()) {
871 <            Node<E> pred = null;
863 <            Node<E> p = head;
864 <            while (p != null) {
871 >            for (Node<E> pred = null, p = head; p != null; ) {
872                  if (p == s) {
873                      unsplice(pred, p);
874                      break;
875                  }
876 <                if (!p.isData && !p.isMatched())
876 >                if (p.isUnmatchedRequest())
877                      break;
878                  pred = p;
879                  if ((p = p.next) == pred) { // stale
# Line 882 | Line 889 | public class LinkedTransferQueue<E> exte
889       */
890      private boolean findAndRemove(Object e) {
891          if (e != null) {
892 <            Node<E> pred = null;
886 <            Node<E> p = head;
887 <            while (p != null) {
892 >            for (Node<E> pred = null, p = head; p != null; ) {
893                  Object item = p.item;
894                  if (p.isData) {
895                      if (item != null && item != p && e.equals(item) &&
# Line 896 | Line 901 | public class LinkedTransferQueue<E> exte
901                  else if (item == null)
902                      break;
903                  pred = p;
904 <                if ((p = p.next) == pred) {
904 >                if ((p = p.next) == pred) { // stale
905                      pred = null;
906                      p = head;
907                  }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines