mas_mat_destroy(mas, &subtrees);
}
-/*
- * mas_wmb_replace() - Write memory barrier and replace
- * @mas: The maple state
- * @old_enode: The old maple encoded node that is being replaced.
- * @new_height: The new height of the tree as a result of the operation
- *
- * Updates gap as necessary.
- */
-static inline void mas_wmb_replace(struct ma_state *mas,
- struct maple_enode *old_enode, unsigned char new_height)
-{
- /* Insert the new data in the tree */
- mas_topiary_replace(mas, old_enode, new_height);
-
- if (mte_is_leaf(mas->node))
- return;
-
- mas_update_gap(mas);
-}
-
static inline void *mtree_range_walk(struct ma_state *mas)
{
unsigned long *pivots;
return NULL;
}
+/*
+ * mas_wmb_replace() - Write memory barrier and replace
+ * @mas: The maple state
+ * @old_enode: The old maple encoded node that is being replaced.
+ * @new_height: The new height of the tree as a result of the operation
+ *
+ * Updates gap as necessary.
+ */
+static inline void mas_wmb_replace(struct ma_state *mas, struct maple_copy *cp)
+{
+ struct maple_enode *old_enode;
+
+ old_enode = mas->node;
+ mas->node = cp->slot[0];
+ /* Insert the new data in the tree */
+ mas_topiary_replace(mas, old_enode, cp->height);
+ if (!mte_is_leaf(mas->node))
+ mas_update_gap(mas);
+
+ mtree_range_walk(mas);
+}
+
/* Direct node to node copy */
static inline
return;
}
+
/*
* mas_wr_spanning_store() - Create a subtree with the store operation completed
* and new nodes where necessary, then place the sub-tree in the actual tree.
*/
static void mas_wr_spanning_store(struct ma_wr_state *wr_mas)
{
- struct maple_enode *old_enode;
struct maple_copy cp;
struct ma_state *mas;
struct ma_state sib;
cp_data_write(&cp, mas);
} while (spanning_ascend(&cp, mas, wr_mas, &r_wr_mas, &sib));
- old_enode = mas->node;
- mas->node = cp.slot[0];
- mas_wmb_replace(mas, old_enode, cp.height);
- mtree_range_walk(mas);
+ mas_wmb_replace(mas, &cp);
}
/*
*/
static void mas_wr_split(struct ma_wr_state *wr_mas)
{
- struct maple_enode *old_enode;
struct ma_state *mas;
struct maple_copy cp;
struct ma_state sib;
cp_data_write(&cp, mas);
} while (split_ascend(&cp, wr_mas, &sib));
- old_enode = mas->node;
- mas->node = cp.slot[0];
- mas_wmb_replace(mas, old_enode, cp.height);
- mtree_range_walk(mas);
+ mas_wmb_replace(mas, &cp);
}
/*
*/
static void mas_wr_rebalance(struct ma_wr_state *wr_mas)
{
-
- struct maple_enode *old_enode;
struct ma_state *mas;
struct maple_copy cp;
struct ma_state sib;
cp_data_write(&cp, mas);
} while (rebalance_ascend(&cp, wr_mas, &sib));
- old_enode = mas->node;
- mas->node = cp.slot[0];
- mas_wmb_replace(mas, old_enode, cp.height);
- mtree_range_walk(mas);
+ mas_wmb_replace(mas, &cp);
}
/*