[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.143, Sun Jan 15 00:00:14 2017 UTC revision 1.144, Sun Jan 15 01:16:22 2017 UTC
# Line 568  Line 568 
568      }      }
569    
570      /**      /**
571       * Collapse dead (matched) nodes between pred and q.       * Collapses dead (matched) nodes between pred and q.
572       * @param pred the last known live node, or null if none       * @param pred the last known live node, or null if none
573       * @param c the first dead node       * @param c the first dead node
574       * @param p the last dead node       * @param p the last dead node
# Line 590  Line 590 
590              ? pred : p;              ? pred : p;
591      }      }
592    
593        /**
594         * Collapses dead (matched) nodes between h and p.
595         * h was once head, and all nodes between h and p are dead.
596         */
597        private void skipDeadNodesNearHead(Node h, Node p) {
598            // assert h != p;
599            // assert p.isMatched();
600            // find live or trailing node, starting at p
601            for (Node q; (q = p.next) != null; ) {
602                if (!q.isMatched()) {
603                    p = q;
604                    break;
605                }
606                if (p == (p = q))
607                    return;
608            }
609            if (h == HEAD.getAcquire(this) && casHead(h, p))
610                h.selfLink();
611        }
612    
613      /* Possible values for "how" argument in xfer method. */      /* Possible values for "how" argument in xfer method. */
614    
615      private static final int NOW   = 0; // for untimed poll, tryTransfer      private static final int NOW   = 0; // for untimed poll, tryTransfer
# Line 622  Line 642 
642                          break;                          break;
643                      if (p.tryMatch(item, e)) {                      if (p.tryMatch(item, e)) {
644                          // collapse at least 2                          // collapse at least 2
645                          if (h != p) tryCollapseHead: {                          if (h != p) skipDeadNodesNearHead(h, p);
                             // find live or trailing node  
                             for (Node q; (q = p.next) != null; ) {  
                                 if (!q.isMatched()) {  
                                     p = q;  
                                     break;  
                                 }  
                                 if (p == (p = q))  
                                     break tryCollapseHead;  
                             }  
                             if (h == head && casHead(h, p))  
                                 h.selfLink();  
                         }  
646                          @SuppressWarnings("unchecked") E itemE = (E) item;                          @SuppressWarnings("unchecked") E itemE = (E) item;
647                          return itemE;                          return itemE;
648                      }                      }
# Line 668  Line 676 
676      private Node tryAppend(Node s, boolean haveData) {      private Node tryAppend(Node s, boolean haveData) {
677          // assert head != null;          // assert head != null;
678          // assert tail != null;          // assert tail != null;
679            // assert s.isData == haveData;
680          for (Node t = tail, p = t;;) {        // move p to last node and append          for (Node t = tail, p = t;;) {        // move p to last node and append
681              Node n, u;                        // temps for reads of next & tail              Node n, u;                        // temps for reads of next & tail
682              if (p == null)              if (p == null)

Legend:
Removed from v.1.143  
changed lines
  Added in v.1.144

Doug Lea
ViewVC Help
Powered by ViewVC 1.0.8