return ret;
}
-static inline unsigned char mas_extend_null(struct ma_state *l_mas,
+static inline void mas_extend_null(struct ma_state *l_mas,
struct ma_state *r_mas)
{
unsigned char l_slot = mas_offset(l_mas);
if (l_mas != r_mas)
mas_set_offset(r_mas, cp_r_slot);
-
- return r_slot;
}
/*
static inline void *_mas_store(struct ma_state *mas, void *entry, bool overwrite)
{
unsigned long r_max, r_min;
- unsigned char end, slot;
+ unsigned char end, offset;
unsigned char slot_cnt;
void *content = NULL;
struct maple_big_node b_node;
int ret = 0;
- if (mas_start(mas) || (mas_is_none(mas) || mas->node == MAS_ROOT)) {
+ if (mas_start(mas) || mas_is_none(mas) || mas->node == MAS_ROOT) {
ret = ma_root_ptr(mas, entry, content, overwrite);
if (mas_is_err(mas))
return NULL;
/* At this point, we are at the leaf node that needs to be altered. */
/* Calculate needed space */
- slot = mas_offset(mas);
- slot_cnt = mt_slot_count(mas->node);
- content = mas_get_slot(mas, slot);
+ offset = mas_offset(mas);
+ content = mas_get_slot(mas, offset);
if (!overwrite && ((mas->last > r_max) || content)) {
mas_set_err(mas, -EEXIST);
- goto exists;
+ return content;
}
- if (!entry) {
+ if (!entry)
mas_extend_null(mas, mas);
- slot = mas_offset(mas);
- }
memset(&b_node, 0, sizeof(struct maple_big_node));
- mas_set_offset(mas, slot);
b_node.b_end = mas_store_b_node(mas, &b_node, entry);
b_node.min = mas->min;
b_node.type = mte_node_type(mas->node);
// Check if this is an append operation.
end = mas_data_end(mas);
+ slot_cnt = mt_slot_count(mas->node);
if (mas_can_append(mas, &b_node, slot_cnt, end)) {
- slot = b_node.b_end;
+ offset = b_node.b_end;
do {
- mte_set_slot(mas->node, slot, b_node.slot[slot]);
- if (slot < slot_cnt - 1)
- mte_set_pivot(mas->node, slot, b_node.pivot[slot]);
- } while(slot && slot-- >= end);
+ mte_set_slot(mas->node, offset, b_node.slot[offset]);
+ if (offset < slot_cnt - 1)
+ mte_set_pivot(mas->node, offset, b_node.pivot[offset]);
+ } while(offset && offset-- >= end);
mas_update_gap(mas);
goto append;
}
return NULL;
append:
spanning_store:
-exists:
return content;
}
if (mas_next_nentry(mas, limit, range_start))
break;
- if (*range_start > limit) {
-// mas->node = MAS_NONE;
+ if (*range_start > limit)
return NULL;
- }
next_node:
mas_next_node(mas, limit);
return;
}
+void mas_dup_pause(struct ma_state *mas)
+{
+ mas->span_enode = mas->node;
+}
+
+bool mas_dup_is_paused(struct ma_state *mas)
+{
+ if (mas->span_enode)
+ return true;
+ return false;
+}
+
+void mas_dup_resume(struct ma_state *mas)
+{
+ mas->node = mas->span_enode;
+ mas->span_enode = NULL;
+}
+
static inline void mas_dup_children(struct ma_state *mas, int *node_cnt)
{
struct maple_node *child;
mte_node_type(mas->node));
if (allocated < end) {
- mas->span_enode = mas->node;
+ mas_dup_pause(mas);
*node_cnt += allocated;
mas_dup_alloc(mas, node_cnt);
if (mas_is_err(mas))
return;
- mas->span_enode = NULL;
- }
+ mas_dup_resume(mas);
+ }
for(offset = 0; offset < end; offset++) {
oldchild = slots[offset];
return;
}
- if (mas->span_enode) {
- mas->node = mas->span_enode;
- mas->span_enode= NULL;
- goto retry_dup_children;
+ if (mas_dup_is_paused(mas)) {
+ mas_dup_resume(mas);
+ goto continue_dup;
}
if (mas_is_start(mas))
if (mte_is_leaf(oldmas->node))
continue;
-retry_dup_children:
+continue_dup:
mas_dup_children(mas, node_cnt);
if (mas_is_err(mas))
return;
mtree_unlock(mas->tree);
}
+void mas_dup_store(struct ma_state *mas, void *entry) {
+ mas_next(mas, ULONG_MAX);
+ mte_set_slot(mas->node, mas_offset(mas), entry);
+}
+
static inline unsigned char mas_dead_leaves(struct ma_state *mas, void **slots)
{
struct maple_node *node;