[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.121, Wed Dec 28 18:07:18 2016 UTC revision 1.122, Wed Dec 28 20:55:41 2016 UTC
# Line 544  Line 544 
544          return SWEEPVOTES.compareAndSet(this, cmp, val);          return SWEEPVOTES.compareAndSet(this, cmp, val);
545      }      }
546    
547        /**
548         * Tries to CAS pred.next (or head, if pred is null) from c to p.
549         */
550        private boolean tryCasSuccessor(Node pred, Node c, Node p) {
551            // assert c != p;
552            if (pred != null)
553                return pred.casNext(c, p);
554            if (casHead(c, p)) {
555                c.forgetNext();
556                return true;
557            }
558            return false;
559        }
560    
561      /*      /*
562       * Possible values for "how" argument in xfer method.       * Possible values for "how" argument in xfer method.
563       */       */
# Line 1426  Line 1440 
1440          if (o == null)          if (o == null)
1441              return false;              return false;
1442          restartFromHead: for (;;) {          restartFromHead: for (;;) {
1443              for (Node pred = null, p = head; p != null; ) {              for (Node p = head, c = p, pred = null, q; p != null; ) {
1444                  Object item = p.item;                  final Object item; boolean pAlive;
1445                  if (p.isData) {                  if (pAlive = (((item = p.item) != null) && p.isData)) {
1446                      if (item != null                      if (o.equals(item) && p.tryMatchData()) {
1447                          && o.equals(item)                          if ((q = p.next) == null) q = p;
1448                          && p.tryMatchData()) {                          if (c != q) tryCasSuccessor(pred, c, q);
                         unsplice(pred, p);  
1449                          return true;                          return true;
1450                      }                      }
1451                  }                  }
1452                  else if (item == null)                  else if (!p.isData && item == null)
1453                      break;                      break;
1454                  if ((pred = p) == (p = p.next))                  if (c != p && tryCasSuccessor(pred, c, p))
1455                        c = p;
1456                    q = p.next;
1457                    if (pAlive || c != p) {
1458                        pred = p;
1459                        p = c = q;
1460                    }
1461                    else if (p == (p = q))
1462                      continue restartFromHead;                      continue restartFromHead;
1463              }              }
1464              return false;              return false;
# Line 1454  Line 1474 
1474       * @return {@code true} if this queue contains the specified element       * @return {@code true} if this queue contains the specified element
1475       */       */
1476      public boolean contains(Object o) {      public boolean contains(Object o) {
1477          if (o != null) {          if (o == null)
1478              for (Node p = head; p != null; ) {              return false;
1479                  Object item = p.item;          restartFromHead: for (;;) {
1480                  if (p.isData) {              for (Node p = head, c = p, pred = null, q; p != null; ) {
1481                      if (item != null && o.equals(item))                  final Object item; final boolean pAlive;
1482                    if (pAlive = (((item = p.item) != null) && p.isData)) {
1483                        if (o.equals(item))
1484                          return true;                          return true;
1485                  }                  }
1486                  else if (item == null)                  else if (!p.isData && item == null)
1487                      break;                      break;
1488                  if (p == (p = p.next))                  if (c != p && tryCasSuccessor(pred, c, p))
1489                      p = head;                      c = p;
1490                    q = p.next;
1491                    if (pAlive || c != p) {
1492                        pred = p;
1493                        p = c = q;
1494              }              }
1495                    else if (p == (p = q))
1496                        continue restartFromHead;
1497          }          }
1498          return false;          return false;
1499      }      }
1500        }
1501    
1502      /**      /**
1503       * Always returns {@code Integer.MAX_VALUE} because a       * Always returns {@code Integer.MAX_VALUE} because a
# Line 1575  Line 1604 
1604       */       */
1605      @SuppressWarnings("unchecked")      @SuppressWarnings("unchecked")
1606      void forEachFrom(Consumer<? super E> action, Node p) {      void forEachFrom(Consumer<? super E> action, Node p) {
1607          while (p != null) {          for (Node c = p, pred = null, q; p != null; ) {
1608              final Object item = p.item;              final Object item; final boolean pAlive;
1609              if (p.isData) {              if (pAlive = (((item = p.item) != null) && p.isData))
                 if (item != null)  
1610                      action.accept((E) item);                      action.accept((E) item);
1611              }              else if (!p.isData && item == null)
             else if (item == null)  
1612                  break;                  break;
1613              if (p == (p = p.next))              if (c != p && tryCasSuccessor(pred, c, p))
1614                  p = head;                  c = p;
1615                q = p.next;
1616                if (pAlive || c != p) {
1617                    pred = p;
1618                    p = c = q;
1619                }
1620                else if (p == (p = q)) {
1621                    pred = null;
1622                    c = p = head;
1623                }
1624          }          }
1625      }      }
1626    

Legend:
Removed from v.1.121  
changed lines
  Added in v.1.122

Doug Lea
ViewVC Help
Powered by ViewVC 1.0.8