if (!n.casValue(v, null)) break; if (!n.appendMarker(f) || !b.casNext(n, f))
if (!n.casValue(v, null)) break; if (!n.appendMarker(f) || !b.casNext(n, f))
if (!n.casValue(v, null)) break; if (!n.appendMarker(f) || !b.casNext(n, f))
if (!b.casNext(n, z)) break; // restart if lost race to append to b int level = randomLevel();
Object key = n.key; Comparable ck = comparable(key); if (!n.appendMarker(f) || !b.casNext(n, f))
if (!b.casNext(n, z)) break; // restart if lost race to append to b int level = randomLevel();
if (!b.casNext(n, z)) break; // restart if lost race to append to b int level = randomLevel();
Object key = n.key; Comparable ck = comparable(key); if (!n.appendMarker(f) || !b.casNext(n, f))
Object key = n.key; Comparable ck = comparable(key); if (!n.appendMarker(f) || !b.casNext(n, f))
/** * Removes first entry; returns its snapshot. * @return null if empty, else snapshot of first entry */ Map.Entry doRemoveFirstEntry() { for (;;) { Node b = head.node; Node n = b.next; if (n == null) return null; Node 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(n.key, v); } }
/** * Removes first entry; returns its snapshot. * @return null if empty, else snapshot of first entry */ Map.Entry doRemoveFirstEntry() { for (;;) { Node b = head.node; Node n = b.next; if (n == null) return null; Node 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(n.key, v); } }
/** * Removes first entry; returns its snapshot. * @return null if empty, else snapshot of first entry */ Map.Entry doRemoveFirstEntry() { for (;;) { Node b = head.node; Node n = b.next; if (n == null) return null; Node 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(n.key, v); } }
/** * Helps out a deletion by appending marker or unlinking from * predecessor. This is called during traversals when value * field seen to be null. * @param b predecessor * @param f successor */ void helpDelete(Node b, Node f) { /* * Rechecking links and then doing only one of the * help-out stages per call tends to minimize CAS * interference among helping threads. */ if (f == next && this == b.next) { if (f == null || f.value != f) // not already marked appendMarker(f); else b.casNext(this, f.next); } }
/** * Helps out a deletion by appending marker or unlinking from * predecessor. This is called during traversals when value * field seen to be null. * @param b predecessor * @param f successor */ void helpDelete(Node b, Node f) { /* * Rechecking links and then doing only one of the * help-out stages per call tends to minimize CAS * interference among helping threads. */ if (f == next && this == b.next) { if (f == null || f.value != f) // not already marked appendMarker(f); else b.casNext(this, f.next); } }
/** * Helps out a deletion by appending marker or unlinking from * predecessor. This is called during traversals when value * field seen to be null. * @param b predecessor * @param f successor */ void helpDelete(Node b, Node f) { /* * Rechecking links and then doing only one of the * help-out stages per call tends to minimize CAS * interference among helping threads. */ if (f == next && this == b.next) { if (f == null || f.value != f) // not already marked appendMarker(f); else b.casNext(this, f.next); } }
/** * Tries to append a deletion marker to this node. * @param f the assumed current successor of this node * @return true if successful */ boolean appendMarker(Node f) { return casNext(f, new Node(f)); }
/** * Tries to append a deletion marker to this node. * @param f the assumed current successor of this node * @return true if successful */ boolean appendMarker(Node f) { return casNext(f, new Node(f)); }
/** * Tries to append a deletion marker to this node. * @param f the assumed current successor of this node * @return true if successful */ boolean appendMarker(Node f) { return casNext(f, new Node(f)); }