[cache_check] detect duplicate mappings or unknown mapping flags
This commit is contained in:
parent
81a72c8a35
commit
19b5c6193f
@ -1,8 +1,11 @@
|
|||||||
#include "caching/mapping_array.h"
|
#include "caching/mapping_array.h"
|
||||||
#include "persistent-data/endian_utils.h"
|
#include "persistent-data/endian_utils.h"
|
||||||
|
|
||||||
|
#include <set>
|
||||||
|
|
||||||
using namespace caching;
|
using namespace caching;
|
||||||
using namespace caching::mapping_array_damage;
|
using namespace caching::mapping_array_damage;
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
//----------------------------------------------------------------
|
//----------------------------------------------------------------
|
||||||
|
|
||||||
@ -55,10 +58,46 @@ invalid_mapping::visit(damage_visitor &v) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
struct no_op_visitor {
|
class mapping_visitor {
|
||||||
virtual void visit(uint32_t index,
|
public:
|
||||||
mapping_traits::value_type const &v) {
|
mapping_visitor(damage_visitor &visitor)
|
||||||
|
: visitor_(visitor) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void visit(uint32_t index, mapping const &m) {
|
||||||
|
block_address cblock = index;
|
||||||
|
|
||||||
|
if (!valid_mapping(m))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (seen_oblock(m))
|
||||||
|
visitor_.visit(invalid_mapping("origin block already mapped", cblock, m));
|
||||||
|
else
|
||||||
|
record_oblock(m);
|
||||||
|
|
||||||
|
if (unknown_flags(m))
|
||||||
|
visitor_.visit(invalid_mapping("unknown flags in mapping", cblock, m));
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
static bool valid_mapping(mapping const &m) {
|
||||||
|
return !!(m.flags_ & M_VALID);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool seen_oblock(mapping const &m) const {
|
||||||
|
return seen_oblocks_.find(m.oblock_) != seen_oblocks_.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
void record_oblock(mapping const &m) {
|
||||||
|
seen_oblocks_.insert(m.oblock_);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool unknown_flags(mapping const &m) {
|
||||||
|
return (m.flags_ & ~(M_VALID | M_DIRTY));
|
||||||
|
}
|
||||||
|
|
||||||
|
damage_visitor &visitor_;
|
||||||
|
set<block_address> seen_oblocks_;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ll_damage_visitor {
|
class ll_damage_visitor {
|
||||||
@ -79,9 +118,9 @@ namespace {
|
|||||||
void
|
void
|
||||||
caching::check_mapping_array(mapping_array const &array, damage_visitor &visitor)
|
caching::check_mapping_array(mapping_array const &array, damage_visitor &visitor)
|
||||||
{
|
{
|
||||||
no_op_visitor vv;
|
mapping_visitor mv(visitor);
|
||||||
ll_damage_visitor ll(visitor);
|
ll_damage_visitor ll(visitor);
|
||||||
array.visit_values(vv, ll);
|
array.visit_values(mv, ll);
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------
|
//----------------------------------------------------------------
|
||||||
|
Loading…
x
Reference in New Issue
Block a user