コード例 #1
0
ファイル: mtree.c プロジェクト: taysom/tau
bool split_branch (tree_s *tree, branch_s *parent, branch_s *child, s64 k)
{
    branch_s	*sibling;
    snint		upper;
    snint		midpoint;
    u32		upper_key;

    if (!branch_is_full(child)) return FALSE;
    FN;
    sibling = new_branch(tree);

    midpoint = child->br_num / 2;
    upper = midpoint + 1;

    sibling->br_first = child->br_key[midpoint].k_node;
    upper_key         = child->br_key[midpoint].k_key;

    memmove(sibling->br_key, &child->br_key[upper],
            sizeof(key_s) * (child->br_num - upper));
    sibling->br_num = child->br_num - upper;

    child->br_num = midpoint;

    insert_sibling(parent, sibling, k, upper_key);
    return TRUE;
}
コード例 #2
0
ファイル: btree.c プロジェクト: taysom/tau
bool split_leaf (void *self, branch_s *parent, int k, unint len)
{
	leaf_s	*child = self;
	leaf_s	*sibling;
	int	upper;
	u64	upper_key;
FN;
	if (!leaf_is_full(child, len)) {
		return FALSE;
	}
	sibling = new_leaf(bdev(parent));

	upper = (child->l_num + 1) / 2;
	upper_key = child->l_rec[upper].r_key;

	copy_recs(sibling, child, upper);

	child->l_num = upper;
	child->l_total += (BLK_SIZE - sizeof(leaf_s)) - sibling->l_total;
	bdirty(child);
	bput(child);

	insert_sibling(parent, sibling, k, upper_key);
	bput(sibling);
	return TRUE;
}
コード例 #3
0
ファイル: btree.c プロジェクト: taysom/tau
bool split_branch (void *self, branch_s *parent, int k)
{
	branch_s	*child  = self;
	branch_s	*sibling;
	int		upper;
	int		midpoint;
	u64		midpoint_key;
FN;
	if (!branch_is_full(child)) return FALSE;

	sibling = new_branch(bdev(child));

	midpoint = child->br_num / 2;
	upper = midpoint + 1;

	sibling->br_first = child->br_key[midpoint].k_block;
	midpoint_key      = child->br_key[midpoint].k_key;

	memmove(sibling->br_key, &child->br_key[upper],
		sizeof(key_s) * (child->br_num - upper));
	sibling->br_num = child->br_num - upper;

	child->br_num = midpoint;
	bdirty(child);
	bput(child);

	insert_sibling(parent, sibling, k, midpoint_key);
	bput(sibling);
	return TRUE;
}
コード例 #4
0
static bool split_leaf (tree_s *tree, leaf_s *child, branch_s *parent, s64 k, unint size)
{
	leaf_s	*sibling;
	snint	upper;
	u64	upper_key;

	if (!leaf_is_full(child, size)) {
		return FALSE;
	}
FN;
	sibling = new_leaf(tree);

	upper = (child->l_num + 1) / 2;
	upper_key = child->l_rec[upper].r_key;

	copy_recs(sibling, child, upper);

	child->l_num = upper;
	child->l_total += (BLK_SIZE - sizeof(leaf_s)) - sibling->l_total;
	tau_blog(child);
	tau_bput(child);

	insert_sibling(parent, sibling, k, upper_key);
	tau_bput(sibling);
	return TRUE;
}