[cvs] / jsr166 / src / main / java / util / concurrent / LinkedTransferQueue.java Repository:
ViewVC logotype

Diff of /jsr166/src/main/java/util/concurrent/LinkedTransferQueue.java

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.10, Wed Oct 28 00:15:07 2009 UTC revision 1.11, Wed Oct 28 10:29:13 2009 UTC
# Line 408  Line 408 
408           */           */
409          final boolean isMatched() {          final boolean isMatched() {
410              Object x = item;              Object x = item;
411              return x == this || (x != null) != isData;              return (x == this) || ((x == null) == isData);
412            }
413    
414            /**
415             * Returns true if this is an unmatched request node.
416             */
417            final boolean isUnmatchedRequest() {
418                return !isData && item == null;
419          }          }
420    
421          /**          /**
# Line 426  Line 433 
433           * Tries to artificially match a data node -- used by remove.           * Tries to artificially match a data node -- used by remove.
434           */           */
435          final boolean tryMatchData() {          final boolean tryMatchData() {
436                assert isData;
437              Object x = item;              Object x = item;
438              if (x != null && x != this && casItem(x, null)) {              if (x != null && x != this && casItem(x, null)) {
439                  LockSupport.unpark(waiter);                  LockSupport.unpark(waiter);
# Line 777  Line 785 
785              Node<E> p = lastRet;              Node<E> p = lastRet;
786              if (p == null) throw new IllegalStateException();              if (p == null) throw new IllegalStateException();
787              lastRet = null;              lastRet = null;
788              findAndRemoveNode(p);              findAndRemoveDataNode(p);
789          }          }
790      }      }
791    
# Line 853  Line 861 
861    
862      /**      /**
863       * Main implementation of Iterator.remove(). Find       * Main implementation of Iterator.remove(). Find
864       * and unsplice the given node.       * and unsplice the given data node.
865       */       */
866      final void findAndRemoveNode(Node<E> s) {      final void findAndRemoveDataNode(Node<E> s) {
867            assert s.isData;
868          if (s.tryMatchData()) {          if (s.tryMatchData()) {
869              Node<E> pred = null;              for (Node<E> pred = null, p = head; p != null; ) {
             Node<E> p = head;  
             while (p != null) {  
870                  if (p == s) {                  if (p == s) {
871                      unsplice(pred, p);                      unsplice(pred, p);
872                      break;                      break;
873                  }                  }
874                  if (!p.isData && !p.isMatched())                  if (p.isUnmatchedRequest())
875                      break;                      break;
876                  pred = p;                  pred = p;
877                  if ((p = p.next) == pred) { // stale                  if ((p = p.next) == pred) { // stale
# Line 880  Line 887 
887       */       */
888      private boolean findAndRemove(Object e) {      private boolean findAndRemove(Object e) {
889          if (e != null) {          if (e != null) {
890              Node<E> pred = null;              for (Node<E> pred = null, p = head; p != null; ) {
             Node<E> p = head;  
             while (p != null) {  
891                  Object item = p.item;                  Object item = p.item;
892                  if (p.isData) {                  if (p.isData) {
893                      if (item != null && item != p && e.equals(item) &&                      if (item != null && item != p && e.equals(item) &&
# Line 894  Line 899 
899                  else if (item == null)                  else if (item == null)
900                      break;                      break;
901                  pred = p;                  pred = p;
902                  if ((p = p.next) == pred) {                  if ((p = p.next) == pred) { // stale
903                      pred = null;                      pred = null;
904                      p = head;                      p = head;
905                  }                  }

Legend:
Removed from v.1.10  
changed lines
  Added in v.1.11

Doug Lea
ViewVC Help
Powered by ViewVC 1.0.8