errval_t mdb_insert(struct cte *new_node) { MDB_TRACE_ENTER(mdb_root, "%p", new_node); errval_t ret = mdb_sub_insert(new_node, &mdb_root); MDB_TRACE_LEAVE_SUB_RET("%"PRIuPTR, ret, mdb_root); }
static errval_t mdb_sub_insert(struct cte *new_node, struct cte **current) { errval_t err; assert(new_node); assert(current); MDB_TRACE_ENTER(*current, "%p, %p (*%p)", new_node, *current, current); struct cte *current_ = *current; if (!current_) { // we've reached an empty leaf, insert here *current = new_node; mdb_update_end(new_node); return SYS_ERR_OK; } int compare = compare_caps(C(new_node), C(current_), true); if (compare < 0) { // new_node < current err = mdb_sub_insert(new_node, &N(current_)->left); if (err_is_fail(err)) { return err; } } else if (compare > 0) { // new_node > current err = mdb_sub_insert(new_node, &N(current_)->right); if (err_is_fail(err)) { return err; } } else { return CAPS_ERR_MDB_DUPLICATE_ENTRY; } mdb_update_end(current_); current_ = mdb_skew(current_); current_ = mdb_split(current_); *current = current_; err = SYS_ERR_OK; MDB_TRACE_LEAVE_SUB_RET("%"PRIuPTR, err, current_); }
errval_t mdb_insert(struct cte *new_node) { MDB_TRACE_ENTER(mdb_root, "%p", new_node); #ifdef IN_KERNEL #ifdef MDB_TRACE_NO_RECURSIVE char prefix[50]; snprintf(prefix, 50, "mdb_insert.%d: ", my_core_id); print_cte(new_node, prefix); #endif #endif errval_t ret = mdb_sub_insert(new_node, &mdb_root); CHECK_INVARIANTS(mdb_root, new_node, true); MDB_TRACE_LEAVE_SUB_RET("%"PRIuPTR, ret, mdb_root); }