diff --git a/persistent-data/data-structures/btree.h b/persistent-data/data-structures/btree.h index d690adb..683aee2 100644 --- a/persistent-data/data-structures/btree.h +++ b/persistent-data/data-structures/btree.h @@ -413,6 +413,10 @@ namespace persistent_data { btree_detail::node_location const &loc, block_address b) const; + template + void inc_children(btree_detail::shadow_spine &spine, + RefCounter &leaf_rc); + typename persistent_data::transaction_manager::ptr tm_; bool destroy_; block_address root_; diff --git a/persistent-data/data-structures/btree.tcc b/persistent-data/data-structures/btree.tcc index 246e068..21a5fdb 100644 --- a/persistent-data/data-structures/btree.tcc +++ b/persistent-data/data-structures/btree.tcc @@ -695,17 +695,7 @@ namespace persistent_data { for (;;) { inc = spine.step(block); - - // FIXME: factor out - { - node_ref nr = spine.template get_node(); - if (nr.get_type() == INTERNAL) - nr.inc_children(internal_rc_); - else { - node_ref leaf = spine.template get_node(); - leaf.inc_children(leaf_rc); - } - } + inc_children(spine, leaf_rc); // patch up the parent to point to the new shadow if (spine.has_parent()) { @@ -820,6 +810,21 @@ namespace persistent_data { v.visit_leaf(loc, ov); } } + + + template + template + void + btree::inc_children(btree_detail::shadow_spine &spine, RefCounter &leaf_rc) + { + node_ref nr = spine.template get_node(); + if (nr.get_type() == INTERNAL) + nr.inc_children(internal_rc_); + else { + node_ref leaf = spine.template get_node(); + leaf.inc_children(leaf_rc); + } + } } //----------------------------------------------------------------