+ new_node = node;
+ /*
+ * Here is the whole trick for lock-free replace: we add
+ * the replacement node _after_ the node we want to
+ * replace by atomically setting its next pointer at the
+ * same time we set its removal and gc flags. Given that
+ * the lookups/get next use an iterator aware of the
+ * next pointer, they will either skip the old node due
+ * to the removal/gc flag and see the new node, or use
+ * the old new, but will not see the new one.
+ */
+ new_node = flag_removed(new_node);
+ new_node = flag_gc(new_node);
+ if (uatomic_cmpxchg(&iter_prev->p.next,
+ iter, new_node) != iter) {
+ continue; /* retry */
+ } else {
+ return_node = iter_prev;