Object v = n.value; if (v == null) { // n is deleted n.helpDelete(b, f); break;
Object v = n.value; if (v == null) { // n is deleted n.helpDelete(b, f); break;
Object v = n.value; if (v == null) { // n is deleted n.helpDelete(b, f); break;
Object v = n.value; if (v == null) { // n is deleted n.helpDelete(b, f); break;
Object v = n.value; if (v == null) { // n is deleted n.helpDelete(b, f); break;
Object v = n.value; if (v == null) { // n is deleted n.helpDelete(b, f); break;
/** * Remove first entry; return either its key or a snapshot. * @param keyOnly if true return key, else return SnapshotEntry * (This is a little ugly, but avoids code duplication.) * @return null if empty, first key if keyOnly true, else key,value entry */ Object doRemoveFirst(boolean keyOnly) { for (;;) { Node<K,V> b = head.node; Node<K,V> n = b.next; if (n == null) return null; Node<K,V> f = n.next; if (n != b.next) continue; Object v = n.value; if (v == null) { n.helpDelete(b, f); continue; } if (!n.casValue(v, null)) continue; if (!n.appendMarker(f) || !b.casNext(n, f)) findFirst(); // retry clearIndexToFirst(); K key = n.key; return (keyOnly)? key : new SnapshotEntry<K,V>(key, (V)v); } }
/** * Specialized variant of findNode to get first valid node * @return first node or null if empty */ Node<K,V> findFirst() { for (;;) { Node<K,V> b = head.node; Node<K,V> n = b.next; if (n == null) return null; if (n.value != null) return n; n.helpDelete(b, n.next); } }