src/java.base/share/classes/java/util/concurrent/LinkedBlockingQueue.java
changeset 48541 946e34c2dec9
parent 47216 71c04702a3d5
child 48843 21efc1774302
equal deleted inserted replaced
48540:221cf8307606 48541:946e34c2dec9
  1058         Node<E> p = null, ancestor = head;
  1058         Node<E> p = null, ancestor = head;
  1059         Node<E>[] nodes = null;
  1059         Node<E>[] nodes = null;
  1060         int n, len = 0;
  1060         int n, len = 0;
  1061         do {
  1061         do {
  1062             // 1. Extract batch of up to 64 elements while holding the lock.
  1062             // 1. Extract batch of up to 64 elements while holding the lock.
  1063             long deathRow = 0;          // "bitset" of size 64
       
  1064             fullyLock();
  1063             fullyLock();
  1065             try {
  1064             try {
  1066                 if (nodes == null) {
  1065                 if (nodes == null) {  // first batch; initialize
  1067                     if (p == null) p = head.next;
  1066                     p = head.next;
  1068                     for (Node<E> q = p; q != null; q = succ(q))
  1067                     for (Node<E> q = p; q != null; q = succ(q))
  1069                         if (q.item != null && ++len == 64)
  1068                         if (q.item != null && ++len == 64)
  1070                             break;
  1069                             break;
  1071                     nodes = (Node<E>[]) new Node<?>[len];
  1070                     nodes = (Node<E>[]) new Node<?>[len];
  1072                 }
  1071                 }
  1075             } finally {
  1074             } finally {
  1076                 fullyUnlock();
  1075                 fullyUnlock();
  1077             }
  1076             }
  1078 
  1077 
  1079             // 2. Run the filter on the elements while lock is free.
  1078             // 2. Run the filter on the elements while lock is free.
       
  1079             long deathRow = 0L;       // "bitset" of size 64
  1080             for (int i = 0; i < n; i++) {
  1080             for (int i = 0; i < n; i++) {
  1081                 final E e;
  1081                 final E e;
  1082                 if ((e = nodes[i].item) != null && filter.test(e))
  1082                 if ((e = nodes[i].item) != null && filter.test(e))
  1083                     deathRow |= 1L << i;
  1083                     deathRow |= 1L << i;
  1084             }
  1084             }
  1093                             && (q = nodes[i]).item != null) {
  1093                             && (q = nodes[i]).item != null) {
  1094                             ancestor = findPred(q, ancestor);
  1094                             ancestor = findPred(q, ancestor);
  1095                             unlink(q, ancestor);
  1095                             unlink(q, ancestor);
  1096                             removed = true;
  1096                             removed = true;
  1097                         }
  1097                         }
       
  1098                         nodes[i] = null; // help GC
  1098                     }
  1099                     }
  1099                 } finally {
  1100                 } finally {
  1100                     fullyUnlock();
  1101                     fullyUnlock();
  1101                 }
  1102                 }
  1102             }
  1103             }