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