[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.123, Thu Dec 29 02:57:39 2016 UTC revision 1.124, Thu Dec 29 03:28:53 2016 UTC
# Line 1571  Line 1571 
1571          return bulkRemove(e -> !c.contains(e));          return bulkRemove(e -> !c.contains(e));
1572      }      }
1573    
1574        public void clear() {
1575            bulkRemove(e -> true);
1576        }
1577    
1578        /**
1579         * Tolerate this many consecutive dead nodes before CAS-collapsing.
1580         * Amortized cost of clear() is (1 + 1/MAX_HOPS) CASes per element.
1581         */
1582        private static final int MAX_HOPS = 8;
1583    
1584      /** Implementation of bulk remove methods. */      /** Implementation of bulk remove methods. */
1585      @SuppressWarnings("unchecked")      @SuppressWarnings("unchecked")
1586      private boolean bulkRemove(Predicate<? super E> filter) {      private boolean bulkRemove(Predicate<? super E> filter) {
1587          boolean removed = false;          boolean removed = false;
1588          restartFromHead: for (;;) {          restartFromHead: for (;;) {
1589              for (Node pred = null, p = head; p != null; ) {              int hops = MAX_HOPS;
1590                  final Object item = p.item;              // c will be CASed to collapse intervening dead nodes between
1591                  if (p.isData) {              // pred (or head if null) and p.
1592                      if (item != null              for (Node p = head, c = p, pred = null, q; p != null; p = q) {
1593                          && filter.test((E)item)                  final Object item; boolean pAlive;
1594                          && p.tryMatchData()) {                  if (pAlive = (((item = p.item) != null) && p.isData)) {
1595                        if (filter.test((E) item)) {
1596                            if (p.tryMatchData())
1597                          removed = true;                          removed = true;
1598                          unsplice(pred, p);                          pAlive = false;
                         p = p.next;  
                         continue;  
1599                      }                      }
1600                  }                  }
1601                  else if (item == null)                  else if (!p.isData && item == null)
1602                      break;                      break;
1603                  if ((pred = p) == (p = p.next))                  if ((q = p.next) == null || pAlive || --hops == 0) {
1604                        // p might already be self-linked here, but if so:
1605                        // - CASing head will surely fail
1606                        // - CASing pred's next will be useless but harmless.
1607                        if (c != p && tryCasSuccessor(pred, c, p))
1608                            c = p;
1609                        // if c != p, CAS failed, so abandon old pred
1610                        if (pAlive || c != p) {
1611                            hops = MAX_HOPS;
1612                            pred = p;
1613                            c = q;
1614                        }
1615                    } else if (p == q)
1616                      continue restartFromHead;                      continue restartFromHead;
1617              }              }
1618              return removed;              return removed;

Legend:
Removed from v.1.123  
changed lines
  Added in v.1.124

Doug Lea
ViewVC Help
Powered by ViewVC 1.0.8