Move debug code out of the "coverage matters" section
This commit is contained in:
128
ConflictSet.cpp
128
ConflictSet.cpp
@@ -997,40 +997,6 @@ void eraseChild(Node *self, uint8_t index) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void debugPrintDot(FILE *file, Node *node) {
|
|
||||||
|
|
||||||
struct DebugDotPrinter {
|
|
||||||
|
|
||||||
explicit DebugDotPrinter(FILE *file) : file(file) {}
|
|
||||||
|
|
||||||
void print(Node *n) {
|
|
||||||
assert(n != nullptr);
|
|
||||||
if (n->entryPresent) {
|
|
||||||
fprintf(file, " k_%p [label=\"m=%d p=%d r=%d\"];\n", (void *)n,
|
|
||||||
int(n->maxVersion), int(n->entry.pointVersion),
|
|
||||||
int(n->entry.rangeVersion));
|
|
||||||
} else {
|
|
||||||
fprintf(file, " k_%p [label=\"m=%d\"];\n", (void *)n,
|
|
||||||
int(n->maxVersion));
|
|
||||||
}
|
|
||||||
for (int child = getChildGeq(n, 0); child >= 0;
|
|
||||||
child = getChildGeq(n, child + 1)) {
|
|
||||||
auto *c = getChildExists(n, child);
|
|
||||||
fprintf(file, " k_%p -> k_%p [label=\"'%02x'\"];\n", (void *)n,
|
|
||||||
(void *)c, child);
|
|
||||||
print(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FILE *file;
|
|
||||||
};
|
|
||||||
|
|
||||||
fprintf(file, "digraph ConflictSet {\n");
|
|
||||||
assert(node != nullptr);
|
|
||||||
DebugDotPrinter printer{file};
|
|
||||||
printer.print(node);
|
|
||||||
fprintf(file, "}\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
Node *nextPhysical(Node *node) {
|
Node *nextPhysical(Node *node) {
|
||||||
int index = -1;
|
int index = -1;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
@@ -1129,6 +1095,8 @@ struct Iterator {
|
|||||||
int cmp;
|
int cmp;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
std::string_view getSearchPath(Arena &arena, Node *n);
|
||||||
|
|
||||||
Iterator lastLeq(Node *n, const std::span<const uint8_t> key) {
|
Iterator lastLeq(Node *n, const std::span<const uint8_t> key) {
|
||||||
auto remaining = key;
|
auto remaining = key;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
@@ -1196,6 +1164,9 @@ void insert(Node **self_, std::span<const uint8_t> key, int64_t writeVersion) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string printable(std::string_view key);
|
||||||
|
std::string printable(const Key &key);
|
||||||
|
|
||||||
struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
|
struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
|
||||||
void check(const ReadRange *reads, Result *result, int count) const {
|
void check(const ReadRange *reads, Result *result, int count) const {
|
||||||
for (int i = 0; i < count; ++i) {
|
for (int i = 0; i < count; ++i) {
|
||||||
@@ -1330,6 +1301,91 @@ __attribute__((__visibility__("default"))) void ConflictSet_destroy(void *cs) {
|
|||||||
|
|
||||||
// GCOVR_EXCL_START
|
// GCOVR_EXCL_START
|
||||||
|
|
||||||
|
std::string printable(std::string_view key) {
|
||||||
|
std::string result;
|
||||||
|
for (uint8_t c : key) {
|
||||||
|
result += "x";
|
||||||
|
result += "0123456789abcdef"[c / 16];
|
||||||
|
result += "0123456789abcdef"[c % 16];
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string printable(const Key &key) {
|
||||||
|
return printable(std::string_view((const char *)key.p, key.len));
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string_view getSearchPath(Arena &arena, Node *n) {
|
||||||
|
if (n->parent == nullptr) {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
auto result = vector<char>(arena);
|
||||||
|
for (; n->parent != nullptr; n = n->parent) {
|
||||||
|
result.push_back(n->parentsIndex);
|
||||||
|
}
|
||||||
|
std::reverse(result.begin(), result.end());
|
||||||
|
return std::string_view((const char *)&result[0], result.size()); // NOLINT
|
||||||
|
}
|
||||||
|
|
||||||
|
void printLogical(std::string &result, Node *node) {
|
||||||
|
Arena arena;
|
||||||
|
for (Node *iter = node; iter != nullptr;) {
|
||||||
|
auto *next = nextLogical(iter);
|
||||||
|
std::string key;
|
||||||
|
for (uint8_t c : getSearchPath(arena, iter)) {
|
||||||
|
key += "x";
|
||||||
|
key += "0123456789abcdef"[c / 16];
|
||||||
|
key += "0123456789abcdef"[c % 16];
|
||||||
|
}
|
||||||
|
if (iter->entry.pointVersion == iter->entry.rangeVersion) {
|
||||||
|
result += key + " -> " + std::to_string(iter->entry.pointVersion) + "\n";
|
||||||
|
} else {
|
||||||
|
result += key + " -> " + std::to_string(iter->entry.pointVersion) + "\n";
|
||||||
|
if (next == nullptr || (getSearchPath(arena, next) !=
|
||||||
|
(std::string(getSearchPath(arena, iter)) +
|
||||||
|
std::string("\x00", 1)))) {
|
||||||
|
result +=
|
||||||
|
key + "x00 -> " + std::to_string(iter->entry.rangeVersion) + "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
iter = next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void debugPrintDot(FILE *file, Node *node) {
|
||||||
|
|
||||||
|
struct DebugDotPrinter {
|
||||||
|
|
||||||
|
explicit DebugDotPrinter(FILE *file) : file(file) {}
|
||||||
|
|
||||||
|
void print(Node *n) {
|
||||||
|
assert(n != nullptr);
|
||||||
|
if (n->entryPresent) {
|
||||||
|
fprintf(file, " k_%p [label=\"m=%d p=%d r=%d\"];\n", (void *)n,
|
||||||
|
int(n->maxVersion), int(n->entry.pointVersion),
|
||||||
|
int(n->entry.rangeVersion));
|
||||||
|
} else {
|
||||||
|
fprintf(file, " k_%p [label=\"m=%d\"];\n", (void *)n,
|
||||||
|
int(n->maxVersion));
|
||||||
|
}
|
||||||
|
for (int child = getChildGeq(n, 0); child >= 0;
|
||||||
|
child = getChildGeq(n, child + 1)) {
|
||||||
|
auto *c = getChildExists(n, child);
|
||||||
|
fprintf(file, " k_%p -> k_%p [label=\"'%02x'\"];\n", (void *)n,
|
||||||
|
(void *)c, child);
|
||||||
|
print(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FILE *file;
|
||||||
|
};
|
||||||
|
|
||||||
|
fprintf(file, "digraph ConflictSet {\n");
|
||||||
|
assert(node != nullptr);
|
||||||
|
DebugDotPrinter printer{file};
|
||||||
|
printer.print(node);
|
||||||
|
fprintf(file, "}\n");
|
||||||
|
}
|
||||||
|
|
||||||
void checkParentPointers(Node *node, bool &success) {
|
void checkParentPointers(Node *node, bool &success) {
|
||||||
for (int i = getChildGeq(node, 0); i >= 0; i = getChildGeq(node, i + 1)) {
|
for (int i = getChildGeq(node, 0); i >= 0; i = getChildGeq(node, i + 1)) {
|
||||||
auto *child = getChildExists(node, i);
|
auto *child = getChildExists(node, i);
|
||||||
@@ -1383,9 +1439,7 @@ bool checkCorrectness(Node *node, ReferenceImpl &refImpl) {
|
|||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
namespace std {
|
namespace std {
|
||||||
void __throw_length_error(const char *) {
|
void __throw_length_error(const char *) { __builtin_unreachable(); }
|
||||||
__builtin_unreachable();
|
|
||||||
}
|
|
||||||
} // namespace std
|
} // namespace std
|
||||||
|
|
||||||
#ifdef ENABLE_MAIN
|
#ifdef ENABLE_MAIN
|
||||||
|
Reference in New Issue
Block a user