[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.32, Mon Oct 11 18:27:39 2010 UTC revision 1.33, Sat Nov 13 15:46:35 2010 UTC
# Line 12  Line 12 
12  import java.util.Iterator;  import java.util.Iterator;
13  import java.util.NoSuchElementException;  import java.util.NoSuchElementException;
14  import java.util.Queue;  import java.util.Queue;
15    import java.util.concurrent.TimeUnit;
16  import java.util.concurrent.locks.LockSupport;  import java.util.concurrent.locks.LockSupport;
17    
18  /**  /**
# Line 781  Line 782 
782           * Moves to next node after prev, or first node if prev null.           * Moves to next node after prev, or first node if prev null.
783           */           */
784          private void advance(Node prev) {          private void advance(Node prev) {
785              lastPred = lastRet;              /*
786              lastRet = prev;               * To track and avoid buildup of deleted nodes in the face
787              for (Node p = (prev == null) ? head : succ(prev);               * of calls to both Queue.remove and Itr.remove, we must
788                   p != null; p = succ(p)) {               * include variants of unsplice and sweep upon each
789                  Object item = p.item;               * advance: Upon Itr.remove, we may need to catch up links
790                  if (p.isData) {               * from lastPred, and upon other removes, we might need to
791                      if (item != null && item != p) {               * skip ahead from stale nodes and unsplice deleted ones
792                 * found while advancing.
793                 */
794    
795                Node r, b; // reset lastPred upon possible deletion of lastRet
796                if ((r = lastRet) != null && !r.isMatched())
797                    lastPred = r;    // next lastPred is old lastRet
798                else if ((b = lastPred) == null || b.isMatched())
799                    lastPred = null; // at start of list
800                else {
801                    Node s, n;       // help with removal of lastPred.next
802                    while ((s = b.next) != null &&
803                           s != b && s.isMatched() &&
804                           (n = s.next) != null && n != s)
805                        b.casNext(s, n);
806                }
807    
808                this.lastRet = prev;
809                for (Node p = prev, s, n;;) {
810                    s = (p == null) ? head : p.next;
811                    if (s == null)
812                        break;
813                    else if (s == p) {
814                        p = null;
815                        continue;
816                    }
817                    Object item = s.item;
818                    if (s.isData) {
819                        if (item != null && item != s) {
820                          nextItem = LinkedTransferQueue.<E>cast(item);                          nextItem = LinkedTransferQueue.<E>cast(item);
821                          nextNode = p;                          nextNode = s;
822                          return;                          return;
823                      }                      }
824                  }                  }
825                  else if (item == null)                  else if (item == null)
826                      break;                      break;
827                    // assert s.isMatched();
828                    if (p == null)
829                        p = s;
830                    else if ((n = s.next) == null)
831                        break;
832                    else if (s == n)
833                        p = null;
834                    else
835                        p.casNext(s, n);
836              }              }
837              nextNode = null;              nextNode = null;
838                nextItem = null;
839          }          }
840    
841          Itr() {          Itr() {
# Line 816  Line 855 
855          }          }
856    
857          public final void remove() {          public final void remove() {
858              Node p = lastRet;              final Node lastRet = this.lastRet;
859              if (p == null) throw new IllegalStateException();              if (lastRet == null)
860              if (p.tryMatchData())                  throw new IllegalStateException();
861                  unsplice(lastPred, p);              this.lastRet = null;
862                if (lastRet.tryMatchData())
863                    unsplice(lastPred, lastRet);
864          }          }
865      }      }
866    

Legend:
Removed from v.1.32  
changed lines
  Added in v.1.33

Doug Lea
ViewVC Help
Powered by ViewVC 1.0.8