[block] use an enum to designate a block as a super block
This commit is contained in:
parent
2973c64e00
commit
dec79974b2
11
block.h
11
block.h
@ -63,6 +63,11 @@ namespace persistent_data {
|
|||||||
void prepare(block &b) const {}
|
void prepare(block &b) const {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum block_type {
|
||||||
|
BT_SUPERBLOCK,
|
||||||
|
BT_NORMAL
|
||||||
|
};
|
||||||
|
|
||||||
struct block {
|
struct block {
|
||||||
typedef boost::shared_ptr<block> ptr;
|
typedef boost::shared_ptr<block> ptr;
|
||||||
|
|
||||||
@ -70,13 +75,13 @@ namespace persistent_data {
|
|||||||
const_buffer &data,
|
const_buffer &data,
|
||||||
unsigned &count,
|
unsigned &count,
|
||||||
unsigned &type_count,
|
unsigned &type_count,
|
||||||
bool is_superblock, // FIXME: make this an enum
|
block_type bt,
|
||||||
typename validator::ptr v)
|
typename validator::ptr v)
|
||||||
: location_(location),
|
: location_(location),
|
||||||
adjuster_(count),
|
adjuster_(count),
|
||||||
type_adjuster_(type_count),
|
type_adjuster_(type_count),
|
||||||
validator_(v),
|
validator_(v),
|
||||||
is_superblock_(is_superblock) {
|
bt_(bt) {
|
||||||
::memcpy(data_, data, sizeof(data));
|
::memcpy(data_, data, sizeof(data));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -85,7 +90,7 @@ namespace persistent_data {
|
|||||||
count_adjuster type_adjuster_;
|
count_adjuster type_adjuster_;
|
||||||
buffer data_;
|
buffer data_;
|
||||||
typename validator::ptr validator_;
|
typename validator::ptr validator_;
|
||||||
bool is_superblock_;
|
block_type bt_;
|
||||||
};
|
};
|
||||||
|
|
||||||
class read_ref {
|
class read_ref {
|
||||||
|
10
block.tcc
10
block.tcc
@ -77,7 +77,7 @@ block_manager<BlockSize>::read_lock(block_address location,
|
|||||||
|
|
||||||
buffer buf;
|
buffer buf;
|
||||||
read_buffer(location, buf);
|
read_buffer(location, buf);
|
||||||
typename block::ptr b(new block(location, buf, lock_count_, ordinary_count_, false, v),
|
typename block::ptr b(new block(location, buf, lock_count_, ordinary_count_, BT_NORMAL, v),
|
||||||
bind(&block_manager::read_release, this, _1));
|
bind(&block_manager::read_release, this, _1));
|
||||||
register_lock(location, READ_LOCK);
|
register_lock(location, READ_LOCK);
|
||||||
return read_ref(b);
|
return read_ref(b);
|
||||||
@ -100,7 +100,7 @@ block_manager<BlockSize>::write_lock(block_address location,
|
|||||||
|
|
||||||
buffer buf;
|
buffer buf;
|
||||||
read_buffer(location, buf);
|
read_buffer(location, buf);
|
||||||
typename block::ptr b(new block(location, buf, lock_count_, ordinary_count_, false, v),
|
typename block::ptr b(new block(location, buf, lock_count_, ordinary_count_, BT_NORMAL, v),
|
||||||
bind(&block_manager::write_release, this, _1));
|
bind(&block_manager::write_release, this, _1));
|
||||||
register_lock(location, WRITE_LOCK);
|
register_lock(location, WRITE_LOCK);
|
||||||
return write_ref(b);
|
return write_ref(b);
|
||||||
@ -115,7 +115,7 @@ block_manager<BlockSize>::write_lock_zero(block_address location,
|
|||||||
|
|
||||||
buffer buf;
|
buffer buf;
|
||||||
zero_buffer(buf);
|
zero_buffer(buf);
|
||||||
typename block::ptr b(new block(location, buf, lock_count_, ordinary_count_, false, v),
|
typename block::ptr b(new block(location, buf, lock_count_, ordinary_count_, BT_NORMAL, v),
|
||||||
bind(&block_manager::write_release, this, _1));
|
bind(&block_manager::write_release, this, _1));
|
||||||
register_lock(location, WRITE_LOCK);
|
register_lock(location, WRITE_LOCK);
|
||||||
return write_ref(b);
|
return write_ref(b);
|
||||||
@ -133,7 +133,7 @@ block_manager<BlockSize>::superblock(block_address location,
|
|||||||
|
|
||||||
buffer buf;
|
buffer buf;
|
||||||
read_buffer(location, buf);
|
read_buffer(location, buf);
|
||||||
typename block::ptr b(new block(location, buf, lock_count_, superblock_count_, true, v),
|
typename block::ptr b(new block(location, buf, lock_count_, superblock_count_, BT_SUPERBLOCK, v),
|
||||||
bind(&block_manager::write_release, this, _1));
|
bind(&block_manager::write_release, this, _1));
|
||||||
register_lock(location, WRITE_LOCK);
|
register_lock(location, WRITE_LOCK);
|
||||||
return write_ref(b);
|
return write_ref(b);
|
||||||
@ -225,7 +225,7 @@ template <uint32_t BlockSize>
|
|||||||
void
|
void
|
||||||
block_manager<BlockSize>::write_release(block *b)
|
block_manager<BlockSize>::write_release(block *b)
|
||||||
{
|
{
|
||||||
if (b->is_superblock_) {
|
if (b->bt_ == BT_SUPERBLOCK) {
|
||||||
if (lock_count_ != 1)
|
if (lock_count_ != 1)
|
||||||
throw runtime_error("superblock isn't the last block");
|
throw runtime_error("superblock isn't the last block");
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user