提交 5a92c5ee 创建 作者: David Benjamin's avatar David Benjamin

Handle leaves above the bottom in radix_iterator2

descend will still break. Also we don't create them yet. But descend probably needs to change.
上级 bd57e37a
...@@ -222,6 +222,7 @@ struct radix_iterator2 { ...@@ -222,6 +222,7 @@ struct radix_iterator2 {
// leaves are at level 0. Later we'll steal a bit for them. The root // leaves are at level 0. Later we'll steal a bit for them. The root
// is path_[radix_levels]. // is path_[radix_levels].
radix_entry path_[radix_levels+1]; radix_entry path_[radix_levels+1];
u32 leaf_;
radix_iterator2(const radix* r, u64 k); radix_iterator2(const radix* r, u64 k);
...@@ -230,7 +231,7 @@ struct radix_iterator2 { ...@@ -230,7 +231,7 @@ struct radix_iterator2 {
return *this; return *this;
} }
radix_elem* operator*() { radix_elem* operator*() {
return path_[0].elem(); return path_[leaf_].elem();
} }
radix_node* node(u32 level) { return path_[level].node(); } radix_node* node(u32 level) { return path_[level].node(); }
......
...@@ -188,7 +188,9 @@ radix_iterator2::radix_iterator2(const radix* r, u64 k) ...@@ -188,7 +188,9 @@ radix_iterator2::radix_iterator2(const radix* r, u64 k)
dprintf("%p: Made iterator with k = %lu\n", r_, k_); dprintf("%p: Made iterator with k = %lu\n", r_, k_);
if (k_ != ~0ULL) { if (k_ != ~0ULL) {
path_[radix_levels] = r_->root_.load(); path_[radix_levels] = r_->root_.load();
if (!find_first_leaf(radix_levels - 1)) if (path_[radix_levels].is_elem())
leaf_ = radix_levels; // Maybe best to not do this...
else if (!find_first_leaf(radix_levels - 1))
k_ = ~0ULL; k_ = ~0ULL;
} }
dprintf("%p: Adjusted: k = %lu\n", r_, k_); dprintf("%p: Adjusted: k = %lu\n", r_, k_);
...@@ -198,7 +200,7 @@ bool ...@@ -198,7 +200,7 @@ bool
radix_iterator2::advance(u32 level) radix_iterator2::advance(u32 level)
{ {
// First, see if we can advance a lower level. // First, see if we can advance a lower level.
if (level > 0 && advance(level-1)) { if (level > leaf_ && advance(level-1)) {
// Nothing more to do. // Nothing more to do.
return true; return true;
} }
...@@ -230,7 +232,12 @@ radix_iterator2::find_first_leaf(u32 level) ...@@ -230,7 +232,12 @@ radix_iterator2::find_first_leaf(u32 level)
} }
path_[level] = next; path_[level] = next;
if (level == 0 || find_first_leaf(level-1)) if (next.is_elem()) {
// Found a leaf. Stop now.
leaf_ = level;
return true;
} else if (find_first_leaf(level-1))
// Keep looking.
return true; return true;
} }
} }
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论