[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