提交 1d7f9493 创建 作者: David Benjamin's avatar David Benjamin

RCU-free radix_node

Not actually doing anything with RCU yet, but we will at some point.
上级 41cde26a
......@@ -23,12 +23,15 @@ class radix_elem : public rcu_freed {
void incref() { ref_++; }
};
struct radix_node {
struct radix_node : public rcu_freed {
markptr<void> ptr[1 << bits_per_level];
radix_node() {
radix_node() : rcu_freed("radix_node") {
for (int i = 0; i < sizeof(ptr) / sizeof(ptr[0]); i++)
ptr[i] = 0;
}
virtual void do_gc() { delete this; }
NEW_DELETE_OPS(radix_node)
};
......@@ -39,6 +42,8 @@ struct radix_range {
u64 start_;
u64 size_;
scoped_gc_epoch gc_;
radix_range(radix* r, u64 start, u64 size);
radix_range(radix_range&&);
~radix_range();
......
......@@ -51,6 +51,7 @@ radix_elem*
radix::search(u64 key)
{
radix_elem *result = 0;
scoped_gc_epoch gc;
descend(key >> shift_, &root_, radix_levels-1, [&result](markptr<void> *v) {
result = (radix_elem*) v->ptr().load();
}, false);
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论