diff --git a/persistent-data/block.h b/persistent-data/block.h index 3834662..f45aae8 100644 --- a/persistent-data/block.h +++ b/persistent-data/block.h @@ -119,6 +119,8 @@ namespace persistent_data { void flush(); + void change_validator(typename block_manager::validator::ptr v); + typename block_io::ptr io_; block_address location_; std::auto_ptr > data_; diff --git a/persistent-data/block.tcc b/persistent-data/block.tcc index cc46ff6..0291cb8 100644 --- a/persistent-data/block.tcc +++ b/persistent-data/block.tcc @@ -235,6 +235,19 @@ block_manager::block::flush() } } +template +void +block_manager::block::change_validator(typename block_manager::validator::ptr v) +{ + if (v.get() != validator_.get()) { + if (dirty_) + validator_->prepare(*data_, location_); + + validator_ = v; + validator_->check(*data_, location_); + } +} + //---------------------------------------------------------------- template @@ -341,9 +354,9 @@ block_manager::read_lock(block_address location, boost::optional cached_block = cache_.get(location); if (cached_block) { - (*cached_block)->check_read_lockable(); - - // FIXME: a different validator may now be set. + typename block::ptr cb = *cached_block; + cb->check_read_lockable(); + cb->change_validator(v); return read_ref(*this, *cached_block); }