void *slots[3];
unsigned long gaps[2];
bool unfinished;
+ unsigned char skip;
};
struct ma_node_state {
unsigned char insert;
enum maple_type type;
unsigned char end;
+ bool alloc;
};
static inline
void mns_node_part_leaf_init(struct ma_node_part *ma_part,
- struct ma_wr_state *wr_mas)
+ struct ma_wr_state *wr_mas, struct ma_node_state *src)
{
ma_part->pos = 0;
ma_part->size = 0;
- //printk("%s: %lx - %lx store %lx - %lx\n", __func__,
- // wr_mas->r_min, wr_mas->r_max,
- // wr_mas->mas->index, wr_mas->mas->last);
+ //printk("%s: %lx - %lx store %lx - %lx\n", __func__, wr_mas->r_min, wr_mas->r_max, wr_mas->mas->index, wr_mas->mas->last);
if (wr_mas->r_min < wr_mas->mas->index) {
ma_part->pivots[0] = wr_mas->mas->index - 1;
ma_part->slots[0] = wr_mas->content;
ma_part->size++;
+ //printk("r_min remains\n");
}
ma_part->pivots[ma_part->size] = wr_mas->mas->last;
ma_part->slots[ma_part->size] = wr_mas->entry;
ma_part->size++;
- if (wr_mas->r_max > wr_mas->mas->last) {
- ma_part->pivots[ma_part->size] = wr_mas->r_max;
- ma_part->slots[ma_part->size] = wr_mas->content;
+ if (wr_mas->end_piv > wr_mas->mas->last) {
+ ma_part->pivots[ma_part->size] = wr_mas->end_piv;
+ ma_part->slots[ma_part->size] = src->slots[wr_mas->offset_end];
ma_part->size++;
+ //printk("r_max remains\n");
}
ma_part->unfinished = false;
ma_part->dst_max_off = 255;
+ ma_part->skip = wr_mas->offset_end - wr_mas->mas->offset + 1;
}
static inline
ma_part->size = 2;
ma_part->unfinished = false;
ma_part->dst_max_off = 255;
+ ma_part->skip = 1;
}
static inline
static inline void mas_wr_converged(struct ma_node_state *src,
struct ma_node_state *dst, struct ma_node_part *ma_part,
- struct ma_state *mas, unsigned int skip)
+ struct ma_state *mas)
{
mns_node_init(dst, mas_pop_node(mas), src->type);
mns_cp(src, dst, mas->offset);
mns_insert_part(ma_part, dst);
- src->offset += skip;
+ src->offset += ma_part->skip;
if (src->offset <= mas->end)
mns_cp(src, dst, mas->end - src->offset + 1);
mns_cp(src, left, mas->offset);
mns_insert_part(ma_part, left);
- src->offset++;
+ src->offset+= ma_part->skip;
+ //printk("\t\tsrc L offset adjusted to %u\n", src->offset);
if (left->offset <= split)
mns_cp(src, left, split - left->offset + 1);
mns_cp(src, right, cp);
mns_insert_part(ma_part, right);
- src->offset++;
+ src->offset+= ma_part->skip;
+ //printk("\t\tsrc offset adjusted to %u\n", src->offset);
if (src->offset <= mas->end)
mns_cp(src, right, mas->end - src->offset + 1);
}
ma_part->dst_max_off = split;
mns_insert_part(ma_part, left);
- l_src->offset++;
+ l_src->offset+= ma_part->skip;
+ //printk("%d\n", __LINE__);
if (left->offset <= split)
mns_cp(l_src, left, split - left->offset + 1);
r_end + new_end + 1, ma_part);
right->min = left->max + 1;
mns_cp(l_src, right, mas_off - l_src->offset);
- l_src->offset++;
mns_insert_part(ma_part, right);
+ //printk("%d\n", __LINE__);
+ l_src->offset+= ma_part->skip;
if (l_end >= l_src->offset)
mns_cp(l_src, right, l_end - l_src->offset + 1);
}
right->min = left->max + 1;
mns_cp(r_src, right, mas_off);
mns_insert_part(ma_part, right);
- r_src->offset++;
+ //printk("%d\n", __LINE__);
+ r_src->offset+= ma_part->skip;
if (r_src->offset <= r_end)
mns_cp(r_src, right, r_end - r_src->offset + 1);
mns_cp(r_src, left, mas_off);
ma_part->dst_max_off = split;
mns_insert_part(ma_part, left);
- r_src->offset++;
+ //printk("%d\n", __LINE__);
+ r_src->offset+= ma_part->skip;
if (r_src->offset < r_split)
mns_cp(r_src, left, r_split - r_src->offset);
if (mas_off > r_src->offset)
mns_cp(r_src, right, mas_off - r_src->offset);
mns_insert_part(ma_part, right);
- r_src->offset++;
+ //printk("%d\n", __LINE__);
+ r_src->offset+= ma_part->skip;
}
if (r_src->offset <= r_end)
mas->end = p_end;
mas->offset = p_off;
mns_node_part_init(ma_part, left, right);
- mas_wr_converged(&parent, &new_parent, ma_part, mas, /* skip = */ 2);
+ ma_part->skip = 2;
+ mas_wr_converged(&parent, &new_parent, ma_part, mas);
src->enode = parent.enode;
mas->node = new_parent.enode;
return true;
trace_ma_op(__func__, mas);
+ //printk("\t\t%s\n", __func__);
//mt_dump(mas->tree, mt_dump_hex);
height = mas_mt_height(mas);
/* FIXME: Save this? */
total = mas_wr_new_end(wr_mas);
split = (total + 1) / 2;
mas->depth = height;
- mns_node_part_leaf_init(&ma_part, wr_mas);
/* First split the leaves */
mns_node_init(&left, mas_pop_node(mas), wr_mas->type);
mns_node_init(&right, mas_pop_node(mas), wr_mas->type);
mns_mas_init(&src, mas);
+ mns_node_part_leaf_init(&ma_part, wr_mas, &src);
src.max = mas->max;
src.min = mas->min;
if ((height > 1) &&
(mas_wr_try_rebalance(mas, &src, mas->end + 1, &left,
&right, &ma_part)))
- goto rebalanced;
+ goto rebalanced;
left.min = src.min;
right.max = src.max;
mas->end = 0;
mas_set_height(mas);
converged:
- mas_wr_converged(&src, &parent, &ma_part, mas, /* skip = */ 1);
+ mas_wr_converged(&src, &parent, &ma_part, mas);
mas->node = parent.enode;
rebalanced:
mas_wmb_replace(mas, src.enode);