diff --git a/persistent-data/block.h b/persistent-data/block.h index 9d571c3..a3e9b0e 100644 --- a/persistent-data/block.h +++ b/persistent-data/block.h @@ -55,11 +55,6 @@ namespace persistent_data { unsigned max_concurrent_locks, mode m); - enum block_type { - BT_SUPERBLOCK, - BT_NORMAL - }; - typedef void (*put_behaviour_fn)(block_cache &, block_cache::block &); class read_ref { @@ -142,6 +137,7 @@ namespace persistent_data { block_address get_nr_blocks() const; + void prefetch(block_address b) const; void flush() const; diff --git a/persistent-data/block.tcc b/persistent-data/block.tcc index 6b75ab8..61fea7c 100644 --- a/persistent-data/block.tcc +++ b/persistent-data/block.tcc @@ -270,6 +270,13 @@ namespace persistent_data { return bc_.get_nr_blocks(); } + template + void + block_manager::prefetch(block_address b) const + { + bc_.prefetch(b); + } + template void block_manager::flush() const diff --git a/persistent-data/data-structures/btree.tcc b/persistent-data/data-structures/btree.tcc index 593e29b..9034aca 100644 --- a/persistent-data/data-structures/btree.tcc +++ b/persistent-data/data-structures/btree.tcc @@ -827,7 +827,10 @@ namespace persistent_data { // FIXME: use a switch statement if (o.get_type() == INTERNAL) { - if (v.visit_internal(loc, o)) + if (v.visit_internal(loc, o)) { + for (unsigned i = 0; i < o.get_nr_entries(); i++) + tm_->prefetch(o.value_at(i)); + for (unsigned i = 0; i < o.get_nr_entries(); i++) { node_location loc2(loc); @@ -836,6 +839,7 @@ namespace persistent_data { walk_tree(v, loc2, o.value_at(i)); } + } } else if (loc.path.size() < Levels - 1) { if (v.visit_internal_leaf(loc, o)) diff --git a/persistent-data/transaction_manager.h b/persistent-data/transaction_manager.h index 196ea4a..10ac8b7 100644 --- a/persistent-data/transaction_manager.h +++ b/persistent-data/transaction_manager.h @@ -66,6 +66,10 @@ namespace persistent_data { return bm_; } + void prefetch(block_address b) { + bm_->prefetch(b); + } + private: void add_shadow(block_address b); void remove_shadow(block_address b);