equal
deleted
inserted
replaced
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 } |