{
info->node = NULL;
info->offset = 0;
- info->new = true;
+ if (!ma_is_leaf(info->type))
+ info->new = true;
info->end = part->size - 1;
info->max = part->pivots[info->end];
info->pivots = part->pivots;
s_slots = ns->info->slots + ns->start;
if (ns->info->new) {
printk("NEW %u: %u-%u\n", i, ns->start, size);
- for (int j = 0; j > size; j++) {
+ for (int j = 0; j < size; j++) {
struct maple_enode *child;
+ unsigned char slot;
- child = ma_enode_ptr(ns->info->slots[j]);
+ slot = ns->start + j;
+ child = ma_enode_ptr(ns->info->slots[slot]);
+ printk("set parent %p => %p \n", mte_to_node(child),
+ ns->dst->node);
mte_set_parent(child, ns->dst->enode,
- j + ns->dst->offset);
+ slot);
}
}
s_piv = ns->info->pivots + ns->start;
printk("part is %u\n", count);
part->offset = 0;
part->leaf = false;
- part->skip = skip;
}
static void mas_wr_spanning_store(struct ma_wr_state *wr_mas)
mni_node_init(&dst[d], mas_pop_node(mas), left.type);
printk("new_end %u max is %u\n", sd.new_end, mt_slots[left.type]);
if (sd.new_end >= 2 * mt_slots[left.type]) {
- sd.split = (sd.new_end + 1) / 3;
+ sd.split = sd.new_end / 3;
sd.mid = sd.split * 2;
d++;
mni_node_init(&dst[d], mas_pop_node(mas), left.type);
d++;
mni_node_init(&dst[d], mas_pop_node(mas), left.type);
} else if (sd.new_end > mt_slots[left.type]) {
- sd.split = (sd.new_end + 1) / 2;
+ sd.split = sd.new_end / 2;
sd.mid = sd.new_end;
d++;
mni_node_init(&dst[d], mas_pop_node(mas), left.type);
if (!dst[0].min && dst[0].max == ULONG_MAX) {
printk("height reduction\n\n");
mas->depth = height;
+ mas_set_height(mas);
left.enode = mas->node;
dst[0].node->parent = parent.node->parent;
mas->node = dst[0].enode;
- mas_set_height(mas);
mni_finalise(&dst[0], &sd);
goto new_root;
}
dst_finalise(dst, max_d, &sd, &part, max_s);
+ printk("r_parent %p %u parent %p %u\n",
+ r_parent.node, r_parent.insert_off , parent.node, parent.insert_off);
+
+ if (!dst[0].min && dst[max_d].max == ULONG_MAX) {
+ printk("New Root\n\n");
+ mas->depth = height + 1;
+ mas_set_height(mas);
+ parent.insert_off = 0;
+ parent.end = part.size - 1;
+ goto converged;
+ }
+
+ part.skip = r_parent.insert_off - parent.insert_off + 1;
+ if (r_parent.node != parent.node)
+ part.skip += parent.end;
+
+
+ printk("->Set skip to %u\n", part.skip);
sd.len = 0;
sd.offset = 0;
mni_mas_init(&left, mas);
//sd.new_end = r_mas.end + mas->end - part.skip + 1 + part.size;
printk("\n\nDone %u vs %u\n",
mas->end - part.skip + part.size, mt_slots[parent.type]);
- part.skip = r_parent.insert_off - parent.insert_off + 1;
- printk("Skip %u\n", part.skip);
printk("parent end is %u\n", parent.end);
+converged:
mas_wr_converged(&parent, &new_parent, &part, mas, &sd);
left.enode = parent.enode;
mas->node = new_parent.enode;
- printk("replace %p with %p\n", left.enode, mas->node);
new_root:
+ printk("replace %p with %p\n", left.enode, mas->node);
mas_wmb_replace(mas, left.enode);
mtree_range_walk(mas);
mt_dump(mas->tree, mt_dump_dec);