d_pivots = ma_pivots(dst, d_mt) + d_start;
s_slots = ma_slots(src, s_mt) + start;
s_pivots = ma_pivots(src, s_mt) + start;
- memcpy(d_slots, s_slots, size * sizeof(void*));
+ memcpy(d_slots, s_slots, size * sizeof(void __rcu*));
if (!ma_is_leaf(d_mt) && s_mt == maple_copy) {
struct maple_enode *edst = mt_mk_node(dst, d_mt);
- for (int i = 0; i < size; i++)
+ printk("dst %p d_slots %p %p\n", dst, d_slots, *d_slots);
+ printk("d_start %u\n", d_start);
+ for (int i = 0; i < size; i++) {
+ printk("set slot %u parent\n", i);
+ printk("d_slots = %p\n", d_slots[i]);
mas_set_parent(mas, d_slots[i], edst, i);
+ }
}
d_gaps = ma_gaps(dst, d_mt);
}
-void spanning_init_cp_src(struct maple_copy *cp)
+static inline void spanning_init_cp_src(struct maple_copy *cp)
{
cp->src[cp->s_count].node = ma_mnode_ptr(cp);
cp->src[cp->s_count].mt = maple_copy;
if (!mt_is_alloc(mas->tree))
mt = maple_range_64;
+ cp->data = cp->d_count;
+ cp->s_count = 0;
spanning_split_dest_setup(cp, mas, mt);
spanning_init_cp_src(cp);
- node_copy(mas, cp->src[0].node, 0, cp->d_count, cp->max, maple_copy,
+ node_copy(mas, cp->src[0].node, 0, cp->data, cp->max, maple_copy,
cp->dst[0].node, 0, mt);
printk("New root\n");
- BUG_ON(1);
+ cp->slot[0] = mt_mk_node(cp->dst[0].node, mt);
}
printk("CONVERGED\n");
cp->dst[0].node->parent = ma_parent_ptr(mas_tree_parent(mas));
while (!mte_is_root(mas->node))
mas_ascend(mas);
+ printk("parent %p vs %p\n", cp->dst[0].node->parent, mas_mn(mas)->parent);
+ printk("cp->dst %p cp->slot %p\n", cp->dst[0].node, mte_to_node(cp->slot[0]));
return false;
} else if (l_wr_mas->mas->node == r_wr_mas->mas->node){
if (cp->d_count == 1) {