[everything] Fix circular shared pointer references.
We had a cycle from transaction_manager <-> space_map, and also from the ref_counters back up to the tm. This prevented objects being destroyed when various programs exited. From now on we'll try and only use a shared ptr if ownership is implied. Otherwise a reference will be used (eg, for up pointers).
This commit is contained in:
@ -98,7 +98,7 @@ namespace {
|
||||
typedef transaction_manager::read_ref read_ref;
|
||||
typedef transaction_manager::write_ref write_ref;
|
||||
|
||||
bitmap(transaction_manager::ptr tm,
|
||||
bitmap(transaction_manager &tm,
|
||||
index_entry const &ie,
|
||||
bcache::validator::ptr v)
|
||||
: tm_(tm),
|
||||
@ -107,7 +107,7 @@ namespace {
|
||||
}
|
||||
|
||||
ref_t lookup(unsigned b) const {
|
||||
read_ref rr = tm_->read_lock(ie_.blocknr_, validator_);
|
||||
read_ref rr = tm_.read_lock(ie_.blocknr_, validator_);
|
||||
void const *bits = bitmap_data(rr);
|
||||
ref_t b1 = test_bit_le(bits, b * 2);
|
||||
ref_t b2 = test_bit_le(bits, b * 2 + 1);
|
||||
@ -117,7 +117,7 @@ namespace {
|
||||
}
|
||||
|
||||
void insert(unsigned b, ref_t n) {
|
||||
write_ref wr = tm_->shadow(ie_.blocknr_, validator_).first;
|
||||
write_ref wr = tm_.shadow(ie_.blocknr_, validator_).first;
|
||||
void *bits = bitmap_data(wr);
|
||||
bool was_free = !test_bit_le(bits, b * 2) && !test_bit_le(bits, b * 2 + 1);
|
||||
if (n == 1 || n == 3)
|
||||
@ -158,7 +158,7 @@ namespace {
|
||||
}
|
||||
|
||||
void iterate(block_address offset, block_address hi, space_map::iterator &it) const {
|
||||
read_ref rr = tm_->read_lock(ie_.blocknr_, validator_);
|
||||
read_ref rr = tm_.read_lock(ie_.blocknr_, validator_);
|
||||
void const *bits = bitmap_data(rr);
|
||||
|
||||
for (unsigned b = 0; b < hi; b++) {
|
||||
@ -181,7 +181,7 @@ namespace {
|
||||
return h + 1;
|
||||
}
|
||||
|
||||
transaction_manager::ptr tm_;
|
||||
transaction_manager &tm_;
|
||||
bcache::validator::ptr validator_;
|
||||
|
||||
index_entry ie_;
|
||||
@ -241,7 +241,7 @@ namespace {
|
||||
typedef transaction_manager::write_ref write_ref;
|
||||
|
||||
sm_disk(index_store::ptr indexes,
|
||||
transaction_manager::ptr tm)
|
||||
transaction_manager &tm)
|
||||
: tm_(tm),
|
||||
bitmap_validator_(new bitmap_block_validator),
|
||||
indexes_(indexes),
|
||||
@ -251,7 +251,7 @@ namespace {
|
||||
}
|
||||
|
||||
sm_disk(index_store::ptr indexes,
|
||||
transaction_manager::ptr tm,
|
||||
transaction_manager &tm,
|
||||
sm_root const &root)
|
||||
: tm_(tm),
|
||||
bitmap_validator_(new bitmap_block_validator),
|
||||
@ -354,7 +354,7 @@ namespace {
|
||||
|
||||
indexes_->resize(bitmap_count);
|
||||
for (block_address i = old_bitmap_count; i < bitmap_count; i++) {
|
||||
write_ref wr = tm_->new_block(bitmap_validator_);
|
||||
write_ref wr = tm_.new_block(bitmap_validator_);
|
||||
|
||||
index_entry ie;
|
||||
ie.blocknr_ = wr.get_location();
|
||||
@ -437,7 +437,7 @@ namespace {
|
||||
}
|
||||
|
||||
protected:
|
||||
transaction_manager::ptr get_tm() const {
|
||||
transaction_manager &get_tm() const {
|
||||
return tm_;
|
||||
}
|
||||
|
||||
@ -501,7 +501,7 @@ namespace {
|
||||
ref_counts_.remove(key);
|
||||
}
|
||||
|
||||
transaction_manager::ptr tm_;
|
||||
transaction_manager &tm_;
|
||||
bcache::validator::ptr bitmap_validator_;
|
||||
index_store::ptr indexes_;
|
||||
block_address nr_blocks_;
|
||||
@ -544,12 +544,12 @@ namespace {
|
||||
public:
|
||||
typedef boost::shared_ptr<btree_index_store> ptr;
|
||||
|
||||
btree_index_store(transaction_manager::ptr tm)
|
||||
btree_index_store(transaction_manager &tm)
|
||||
: tm_(tm),
|
||||
bitmaps_(tm, index_entry_traits::ref_counter()) {
|
||||
}
|
||||
|
||||
btree_index_store(transaction_manager::ptr tm,
|
||||
btree_index_store(transaction_manager &tm,
|
||||
block_address root)
|
||||
: tm_(tm),
|
||||
bitmaps_(tm, root, index_entry_traits::ref_counter()) {
|
||||
@ -592,7 +592,7 @@ namespace {
|
||||
}
|
||||
|
||||
private:
|
||||
transaction_manager::ptr tm_;
|
||||
transaction_manager &tm_;
|
||||
btree<1, index_entry_traits> bitmaps_;
|
||||
};
|
||||
|
||||
@ -600,13 +600,13 @@ namespace {
|
||||
public:
|
||||
typedef boost::shared_ptr<metadata_index_store> ptr;
|
||||
|
||||
metadata_index_store(transaction_manager::ptr tm)
|
||||
metadata_index_store(transaction_manager &tm)
|
||||
: tm_(tm) {
|
||||
block_manager<>::write_ref wr = tm_->new_block(index_validator());
|
||||
block_manager<>::write_ref wr = tm_.new_block(index_validator());
|
||||
bitmap_root_ = wr.get_location();
|
||||
}
|
||||
|
||||
metadata_index_store(transaction_manager::ptr tm, block_address root, block_address nr_indexes)
|
||||
metadata_index_store(transaction_manager &tm, block_address root, block_address nr_indexes)
|
||||
: tm_(tm),
|
||||
bitmap_root_(root) {
|
||||
resize(nr_indexes);
|
||||
@ -627,7 +627,7 @@ namespace {
|
||||
|
||||
virtual void commit_ies() {
|
||||
std::pair<block_manager<>::write_ref, bool> p =
|
||||
tm_->shadow(bitmap_root_, index_validator());
|
||||
tm_.shadow(bitmap_root_, index_validator());
|
||||
|
||||
bitmap_root_ = p.first.get_location();
|
||||
metadata_index *mdi = reinterpret_cast<metadata_index *>(p.first.data());
|
||||
@ -661,14 +661,14 @@ namespace {
|
||||
private:
|
||||
void load_ies() {
|
||||
block_manager<>::read_ref rr =
|
||||
tm_->read_lock(bitmap_root_, index_validator());
|
||||
tm_.read_lock(bitmap_root_, index_validator());
|
||||
|
||||
metadata_index const *mdi = reinterpret_cast<metadata_index const *>(rr.data());
|
||||
for (unsigned i = 0; i < entries_.size(); i++)
|
||||
index_entry_traits::unpack(*(mdi->index + i), entries_[i]);
|
||||
}
|
||||
|
||||
transaction_manager::ptr tm_;
|
||||
transaction_manager &tm_;
|
||||
block_address bitmap_root_;
|
||||
std::vector<index_entry> entries_;
|
||||
};
|
||||
@ -677,7 +677,7 @@ namespace {
|
||||
//----------------------------------------------------------------
|
||||
|
||||
checked_space_map::ptr
|
||||
persistent_data::create_disk_sm(transaction_manager::ptr tm,
|
||||
persistent_data::create_disk_sm(transaction_manager &tm,
|
||||
block_address nr_blocks)
|
||||
{
|
||||
index_store::ptr store(new btree_index_store(tm));
|
||||
@ -688,7 +688,7 @@ persistent_data::create_disk_sm(transaction_manager::ptr tm,
|
||||
}
|
||||
|
||||
checked_space_map::ptr
|
||||
persistent_data::open_disk_sm(transaction_manager::ptr tm, void *root)
|
||||
persistent_data::open_disk_sm(transaction_manager &tm, void *root)
|
||||
{
|
||||
sm_root_disk d;
|
||||
sm_root v;
|
||||
@ -700,7 +700,7 @@ persistent_data::open_disk_sm(transaction_manager::ptr tm, void *root)
|
||||
}
|
||||
|
||||
checked_space_map::ptr
|
||||
persistent_data::create_metadata_sm(transaction_manager::ptr tm, block_address nr_blocks)
|
||||
persistent_data::create_metadata_sm(transaction_manager &tm, block_address nr_blocks)
|
||||
{
|
||||
index_store::ptr store(new metadata_index_store(tm));
|
||||
checked_space_map::ptr sm(new sm_disk(store, tm));
|
||||
@ -711,7 +711,7 @@ persistent_data::create_metadata_sm(transaction_manager::ptr tm, block_address n
|
||||
}
|
||||
|
||||
checked_space_map::ptr
|
||||
persistent_data::open_metadata_sm(transaction_manager::ptr tm, void *root)
|
||||
persistent_data::open_metadata_sm(transaction_manager &tm, void *root)
|
||||
{
|
||||
sm_root_disk d;
|
||||
sm_root v;
|
||||
|
@ -26,16 +26,16 @@
|
||||
|
||||
namespace persistent_data {
|
||||
checked_space_map::ptr
|
||||
create_disk_sm(transaction_manager::ptr tm, block_address nr_blocks);
|
||||
create_disk_sm(transaction_manager &tm, block_address nr_blocks);
|
||||
|
||||
checked_space_map::ptr
|
||||
open_disk_sm(transaction_manager::ptr tm, void *root);
|
||||
open_disk_sm(transaction_manager &tm, void *root);
|
||||
|
||||
checked_space_map::ptr
|
||||
create_metadata_sm(transaction_manager::ptr tm, block_address nr_blocks);
|
||||
create_metadata_sm(transaction_manager &tm, block_address nr_blocks);
|
||||
|
||||
checked_space_map::ptr
|
||||
open_metadata_sm(transaction_manager::ptr tm, void *root);
|
||||
open_metadata_sm(transaction_manager &tm, void *root);
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------
|
||||
|
Reference in New Issue
Block a user