part->slots[part->size] = src->slots[wr_r->offset_end];
part->size++;
printk("part 2 %lu\n", part->pivots[part->size-1]);
+ } else {
+ part->skip++;
}
part->skip = wr_r->offset_end - wr_l->mas->offset + wr_l->mas->end + 1;
s_piv = ns->info->pivots + ns->start;
s_gap = ns->info->gaps;
if (ns->start + size > mt_pivots[ns->info->type]) {
+ printk("%d\n", __LINE__);
piv_overflow = 1;
max = ns->info->max;
} else {
+ printk("%d from %u\n", __LINE__, size - 1);
+ printk("%lu + %lu\n", ns->info->pivots, ns->start);
max = s_piv[size - 1];
}
printk("->max is %lu\n", max);
part->gaps[i] = dst[i].max_gap;
}
part->size = count + 1;
+ printk("part is %u\n", count);
part->offset = 0;
part->leaf = false;
part->skip = skip;
*
*/
/* Set up sources (up to 3) + part (always) */
- sd.new_end = r_mas.end + mas->end - part.skip + 1 + part.size;
+ sd.new_end = mas->end - part.skip + 1 + part.size;
+ if (r_mas.node != mas->node)
+ sd.new_end += r_mas.end;
+
printk("\tAt %p and r_mas %p\n", mas_mn(mas), mas_mn(&r_mas));
printk("new end is %u (%u + %u - %u + 1 + %u)\n", sd.new_end,
r_mas.end, mas->end, part.skip, part.size);
printk("Start right at %u end is %u\n", right.offset, right.end);
mni_node_init(&dst[d], mas_pop_node(mas), left.type);
- printk("new_end %u\n", sd.new_end);
- if (sd.new_end > 2 * mt_slots[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.mid = sd.split * 2;
d++;
printk("\n\n");
printk("parent is %p d is %u\n", parent.node, d);
mns_assemble(sd.states, sd.len);
- if (ma_is_root(parent.node)) {
- printk("\n\nNew root\n");
- if (!dst[0].min && dst[0].max == ULONG_MAX) {
- printk("height reduction\n\n");
- mas->depth = height;
- 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;
- }
+ if (!dst[0].min && dst[0].max == ULONG_MAX) {
+ printk("height reduction\n\n");
+ mas->depth = height;
+ 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);
sd.len = 0;
sd.offset = 0;
- } while ((parent.node != r_parent.node) &&
- sd.new_end >= mt_slots[parent.type]);
-
- printk("\n\nDone\n");
+ mni_mas_init(&left, mas);
+ mni_mas_init(&right, &r_mas);
+ printk("again\n\n");
+ } while ((parent.node != r_parent.node) ||
+ mas->end - part.skip + part.size >= mt_slots[parent.type]);
+
+ //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);