提交 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 {
// leaves are at level 0. Later we'll steal a bit for them. The root
// is path_[radix_levels].
radix_entry path_[radix_levels+1];
u32 leaf_;
radix_iterator2(const radix* r, u64 k);
......@@ -230,7 +231,7 @@ struct radix_iterator2 {
return *this;
}
radix_elem* operator*() {
return path_[0].elem();
return path_[leaf_].elem();
}
radix_node* node(u32 level) { return path_[level].node(); }
......
......@@ -188,7 +188,9 @@ radix_iterator2::radix_iterator2(const radix* r, u64 k)
dprintf("%p: Made iterator with k = %lu\n", r_, k_);
if (k_ != ~0ULL) {
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;
}
dprintf("%p: Adjusted: k = %lu\n", r_, k_);
......@@ -198,7 +200,7 @@ bool
radix_iterator2::advance(u32 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.
return true;
}
......@@ -230,7 +232,12 @@ radix_iterator2::find_first_leaf(u32 level)
}
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;
}
}
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论