[space-maps/recursive] Remove some code duplication.
This commit is contained in:
parent
65fcda062f
commit
0e54de95e1
@ -44,6 +44,7 @@ namespace {
|
|||||||
int32_t rc_;
|
int32_t rc_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Aggregates two block_ops
|
||||||
block_op operator +(block_op const &lhs, block_op const &rhs) {
|
block_op operator +(block_op const &lhs, block_op const &rhs) {
|
||||||
switch (lhs.op_) {
|
switch (lhs.op_) {
|
||||||
case INC:
|
case INC:
|
||||||
@ -87,24 +88,7 @@ namespace {
|
|||||||
}
|
}
|
||||||
|
|
||||||
virtual ref_t get_count(block_address b) const {
|
virtual ref_t get_count(block_address b) const {
|
||||||
ref_t count = sm_->get_count(b);
|
return modify_count(b, sm_->get_count(b));
|
||||||
|
|
||||||
auto ops_it = ops_.find(b);
|
|
||||||
if (ops_it != ops_.end()) {
|
|
||||||
auto const &op = ops_it->second;
|
|
||||||
|
|
||||||
switch (op.op_) {
|
|
||||||
case INC:
|
|
||||||
count += op.rc_;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SET:
|
|
||||||
count = op.rc_;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return count;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void set_count(block_address b, ref_t c) {
|
virtual void set_count(block_address b, ref_t c) {
|
||||||
@ -155,25 +139,7 @@ namespace {
|
|||||||
if (gto)
|
if (gto)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
ref_t count = 1;
|
return modify_count(b, 1) > 1;
|
||||||
|
|
||||||
// FIXME: duplication
|
|
||||||
auto ops_it = ops_.find(b);
|
|
||||||
if (ops_it != ops_.end()) {
|
|
||||||
auto const &op = ops_it->second;
|
|
||||||
|
|
||||||
switch (op.op_) {
|
|
||||||
case INC:
|
|
||||||
count += op.rc_;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SET:
|
|
||||||
count = op.rc_;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return count > 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void extend(block_address extra_blocks) {
|
virtual void extend(block_address extra_blocks) {
|
||||||
@ -222,7 +188,27 @@ namespace {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
uint32_t modify_count(block_address b, uint32_t count) const {
|
||||||
|
auto ops_it = ops_.find(b);
|
||||||
|
if (ops_it != ops_.end()) {
|
||||||
|
auto const &op = ops_it->second;
|
||||||
|
|
||||||
|
switch (op.op_) {
|
||||||
|
case INC:
|
||||||
|
count += op.rc_;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SET:
|
||||||
|
count = op.rc_;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
void flush_ops_() {
|
void flush_ops_() {
|
||||||
|
// FIXME: we need to remove entries as we act upon them
|
||||||
for (auto const &p : ops_) {
|
for (auto const &p : ops_) {
|
||||||
// FIXME: lift outside the loop?
|
// FIXME: lift outside the loop?
|
||||||
recursing_lock lock(*this);
|
recursing_lock lock(*this);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user