本文整理汇总了C++中LeafNode::write_lock方法的典型用法代码示例。如果您正苦于以下问题:C++ LeafNode::write_lock方法的具体用法?C++ LeafNode::write_lock怎么用?C++ LeafNode::write_lock使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类LeafNode
的用法示例。
在下文中一共展示了LeafNode::write_lock方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: merge
void LeafNode::merge(Slice anchor)
{
if (balancing_) {
unlock();
return;
}
balancing_ = true;
assert(records_.size() == 0);
// release the write lock
unlock();
// acquire write locks from root to leaf
vector<DataNode*> path;
tree_->lock_path(anchor, path);
assert(path.back() == this);
// may have insertions during this period
if (records_.size() > 0) {
while (path.size()) {
path.back()->unlock();
path.back()->dec_ref();
path.pop_back();
}
return;
}
if (left_sibling_ >= NID_LEAF_START) {
LeafNode *ll = (LeafNode*)tree_->load_node(left_sibling_, false);
assert(ll);
ll->write_lock();
ll->right_sibling_ = right_sibling_;
ll->set_dirty(true);
ll->unlock();
ll->dec_ref();
}
if (right_sibling_ >= NID_LEAF_START) {
LeafNode *rl = (LeafNode*)tree_->load_node(right_sibling_, false);
assert(rl);
rl->write_lock();
rl->left_sibling_ = left_sibling_;
rl->set_dirty(true);
rl->unlock();
rl->dec_ref();
}
dead_ = true;
balancing_ = false;
path.pop_back();
unlock();
dec_ref();
// propagation
InnerNode *parent = (InnerNode*) path.back();
assert(parent);
parent->rm_pivot(nid_, path);
}
开发者ID:jameswei,项目名称:cascadb,代码行数:56,代码来源:node.cpp示例2: split
void LeafNode::split(Slice anchor)
{
if (balancing_) {
unlock();
return;
}
balancing_ = true;
assert(records_.size() > 1);
// release the write lock
unlock();
// need to search from root to leaf again
// since the path may be modified
vector<DataNode*> path;
tree_->lock_path(anchor, path);
assert(path.back() == this);
// may have deletions during this period
if (records_.size() <= 1 ||
(records_.size() <= (tree_->options_.leaf_node_record_count / 2) &&
size() <= (tree_->options_.leaf_node_page_size / 2) )) {
while (path.size()) {
path.back()->unlock();
path.back()->dec_ref();
path.pop_back();
}
return;
}
// create new leaf
LeafNode *nl = tree_->new_leaf_node();
assert(nl);
// set siblings
nl->left_sibling_ = nid_;
nl->right_sibling_ = right_sibling_;
if(right_sibling_ >= NID_LEAF_START) {
LeafNode *rl = (LeafNode*)tree_->load_node(right_sibling_, false);
assert(rl);
rl->write_lock();
rl->left_sibling_ = nl->nid_;
rl->set_dirty(true);
rl->unlock();
rl->dec_ref();
}
right_sibling_ = nl->nid_;
Slice k = records_.split(nl->records_);
refresh_buckets_info();
nl->refresh_buckets_info();
set_dirty(true);
nl->set_dirty(true);
nl->dec_ref();
balancing_ = false;
path.pop_back();
unlock();
dec_ref();
// propagation
InnerNode *parent = (InnerNode*) path.back();
assert(parent);
parent->add_pivot(k, nl->nid_, path);
}
开发者ID:jameswei,项目名称:cascadb,代码行数:65,代码来源:node.cpp本文标签属性:
示例:示例英语
代码:代码编程