int j = randomLevel(); if (j > h.level) j = h.level + 1; Node<K,V> z = new Node<K,V>(key, val, null); basepred.next = z; basepred = z;
Object v = n.value; if (v == null) { // n is deleted n.helpDelete(b, f); break; if (!n.casValue(v, null)) break; if (!n.appendMarker(f) || !b.casNext(n, f))
/** * Submap version of ConcurrentSkipListMap.getNearEntry */ private Map.Entry<K,V> getNearEntry(K key, int rel) { if (isDescending) { // adjust relation for direction if ((rel & LT) == 0) rel |= LT; else rel &= ~LT; } if (tooLow(key)) return ((rel & LT) != 0) ? null : lowestEntry(); if (tooHigh(key)) return ((rel & LT) != 0) ? highestEntry() : null; for (;;) { Node<K,V> n = m.findNear(key, rel); if (n == null || !inBounds(n.key)) return null; K k = n.key; V v = n.getValidValue(); if (v != null) return new AbstractMap.SimpleImmutableEntry<K,V>(k, v); } }
Node<K,V> n = b.next; if (n == null) { if (b.isBaseHeader()) // empty return null; else Object v = n.value; if (v == null) { // n is deleted n.helpDelete(b, f); break; continue; if (!n.casValue(v, null)) break; K key = n.key; Comparable<? super K> ck = comparable(key); if (!n.appendMarker(f) || !b.casNext(n, f))
for (;;) { if (n == null) return ((rel & LT) == 0 || b.isBaseHeader()) ? null : b; Node<K,V> f = n.next; if (n != b.next) // inconsistent read Object v = n.value; if (v == null) { // n is deleted n.helpDelete(b, f); break; return n; if ( c <= 0 && (rel & LT) != 0) return b.isBaseHeader() ? null : b; b = n; n = f;
for (;;) { if (n == null) return ((rel & LT) == 0 || b.isBaseHeader()) ? null : b; Node<K,V> f = n.next; if (n != b.next) // inconsistent read Object v = n.value; if (v == null) { // n is deleted n.helpDelete(b, f); break; return n; if ( c <= 0 && (rel & LT) != 0) return b.isBaseHeader() ? null : b; b = n; n = f;
for (;;) { if (n == null) return ((rel & LT) == 0 || b.isBaseHeader()) ? null : b; Node<K,V> f = n.next; if (n != b.next) // inconsistent read Object v = n.value; if (v == null) { // n is deleted n.helpDelete(b, f); break; return n; if ( c <= 0 && (rel & LT) != 0) return b.isBaseHeader() ? null : b; b = n; n = f;
Node<K,V> n = b.next; if (n == null) { if (b.isBaseHeader()) // empty return null; else Object v = n.value; if (v == null) { // n is deleted n.helpDelete(b, f); break; continue; if (!n.casValue(v, null)) break; K key = n.key; Comparable<? super K> ck = comparable(key); if (!n.appendMarker(f) || !b.casNext(n, f))
for (;;) { if (n == null) return ((rel & LT) == 0 || b.isBaseHeader()) ? null : b; Node<K,V> f = n.next; if (n != b.next) // inconsistent read Object v = n.value; if (v == null) { // n is deleted n.helpDelete(b, f); break; return n; if ( c <= 0 && (rel & LT) != 0) return b.isBaseHeader() ? null : b; b = n; n = f;
for (;;) { if (n == null) return ((rel & LT) == 0 || b.isBaseHeader()) ? null : b; Node<K,V> f = n.next; if (n != b.next) // inconsistent read Object v = n.value; if (v == null) { // n is deleted n.helpDelete(b, f); break; return n; if ( c <= 0 && (rel & LT) != 0) return b.isBaseHeader() ? null : b; b = n; n = f;
for (;;) { if (n == null) return ((rel & LT) == 0 || b.isBaseHeader()) ? null : b; Node<K,V> f = n.next; if (n != b.next) // inconsistent read Object v = n.value; if (v == null) { // n is deleted n.helpDelete(b, f); break; return n; if ( c <= 0 && (rel & LT) != 0) return b.isBaseHeader() ? null : b; b = n; n = f;
for (;;) { if (n == null) return ((rel & LT) == 0 || b.isBaseHeader()) ? null : b; Node<K,V> f = n.next; if (n != b.next) // inconsistent read Object v = n.value; if (v == null) { // n is deleted n.helpDelete(b, f); break; return n; if ( c <= 0 && (rel & LT) != 0) return b.isBaseHeader() ? null : b; b = n; n = f;
Node<K,V> n = b.next; if (n == null) { if (b.isBaseHeader()) // empty return null; else Object v = n.value; if (v == null) { // n is deleted n.helpDelete(b, f); break; continue; if (!n.casValue(v, null)) break; K key = n.key; Comparable<? super K> ck = comparable(key); if (!n.appendMarker(f) || !b.casNext(n, f))
for (;;) { if (n == null) return ((rel & LT) == 0 || b.isBaseHeader()) ? null : b; Node<K,V> f = n.next; if (n != b.next) // inconsistent read Object v = n.value; if (v == null) { // n is deleted n.helpDelete(b, f); break; return n; if ( c <= 0 && (rel & LT) != 0) return b.isBaseHeader() ? null : b; b = n; n = f;
for (;;) { if (n == null) return ((rel & LT) == 0 || b.isBaseHeader()) ? null : b; Node<K,V> f = n.next; if (n != b.next) // inconsistent read Object v = n.value; if (v == null) { // n is deleted n.helpDelete(b, f); break; return n; if ( c <= 0 && (rel & LT) != 0) return b.isBaseHeader() ? null : b; b = n; n = f;
for (;;) { if (n == null) return ((rel & LT) == 0 || b.isBaseHeader()) ? null : b; Node<K,V> f = n.next; if (n != b.next) // inconsistent read Object v = n.value; if (v == null) { // n is deleted n.helpDelete(b, f); break; return n; if ( c <= 0 && (rel & LT) != 0) return b.isBaseHeader() ? null : b; b = n; n = f;
/** * Removes first entry; returns its snapshot. * @return null if empty, else snapshot of first entry */ Map.Entry<K,V> doRemoveFirstEntry() { 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(); return new AbstractMap.SimpleImmutableEntry<K,V>(n.key, (V)v); } }
/** * {@inheritDoc} * * @throws ClassCastException if the specified key cannot be compared * with the keys currently in the map * @throws NullPointerException if any of the arguments are null */ public boolean replace(K key, V oldValue, V newValue) { if (oldValue == null || newValue == null) throw new NullPointerException(); Comparable<? super K> k = comparable(key); for (;;) { Node<K,V> n = findNode(k); if (n == null) return false; Object v = n.value; if (v != null) { if (!oldValue.equals(v)) return false; if (n.casValue(v, newValue)) return true; } } }
/** * {@inheritDoc} * * @return the previous value associated with the specified key, * or {@code null} if there was no mapping for the key * @throws ClassCastException if the specified key cannot be compared * with the keys currently in the map * @throws NullPointerException if the specified key or value is null */ public V replace(K key, V value) { if (value == null) throw new NullPointerException(); Comparable<? super K> k = comparable(key); for (;;) { Node<K,V> n = findNode(k); if (n == null) return null; Object v = n.value; if (v != null && n.casValue(v, value)) return (V)v; } }
/** * Removes first entry; returns its snapshot. * @return null if empty, else snapshot of first entry */ Map.Entry<K,V> doRemoveFirstEntry() { 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(); return new AbstractMap.SimpleImmutableEntry<K,V>(n.key, (V)v); } }