Debug print dot
This commit is contained in:
@@ -882,9 +882,69 @@ 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=\"'%c'\"];\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");
|
||||||
|
}
|
||||||
|
|
||||||
|
static Node *insert(Node *&self, std::span<const uint8_t> key,
|
||||||
|
int64_t writeVersion) {
|
||||||
|
self->maxVersion = writeVersion;
|
||||||
|
if (key.size() == 0) {
|
||||||
|
self->entryPresent = true;
|
||||||
|
self->entry.pointVersion = writeVersion;
|
||||||
|
// TODO set correct rangeVersion
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
auto &child = getOrCreateChild(self, key.front());
|
||||||
|
if (!child) {
|
||||||
|
child = newNode();
|
||||||
|
child->parent = self;
|
||||||
|
child->parentsIndex = key.front();
|
||||||
|
}
|
||||||
|
return insert(child, key.subspan(1, key.size() - 1), writeVersion);
|
||||||
|
}
|
||||||
|
|
||||||
struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
|
struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
|
||||||
void check(const ReadRange *, Result *, int) const {}
|
void check(const ReadRange *, Result *, int) const {}
|
||||||
void addWrites(const WriteRange *, int) {}
|
void addWrites(const WriteRange *writes, int count) {
|
||||||
|
for (int i = 0; i < count; ++i) {
|
||||||
|
const auto &w = writes[i];
|
||||||
|
// TODO support non-point writes
|
||||||
|
assert(w.end.len == 0);
|
||||||
|
insert(root, std::span<const uint8_t>(w.begin.p, w.begin.len),
|
||||||
|
w.writeVersion);
|
||||||
|
}
|
||||||
|
}
|
||||||
void setOldestVersion(int64_t oldestVersion) {
|
void setOldestVersion(int64_t oldestVersion) {
|
||||||
this->oldestVersion = oldestVersion;
|
this->oldestVersion = oldestVersion;
|
||||||
}
|
}
|
||||||
@@ -906,7 +966,7 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
|
|||||||
// Add all children to toFree
|
// Add all children to toFree
|
||||||
for (int child = getChildGeq(n, 0); child >= 0;
|
for (int child = getChildGeq(n, 0); child >= 0;
|
||||||
child = getChildGeq(n, child + 1)) {
|
child = getChildGeq(n, child + 1)) {
|
||||||
auto *c = getChild(n, child);
|
auto *c = getChildExists(n, child);
|
||||||
assert(c != nullptr);
|
assert(c != nullptr);
|
||||||
toFree.push_back(c);
|
toFree.push_back(c);
|
||||||
}
|
}
|
||||||
@@ -914,7 +974,6 @@ struct __attribute__((visibility("hidden"))) ConflictSet::Impl {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
|
||||||
Node *root;
|
Node *root;
|
||||||
int64_t oldestVersion;
|
int64_t oldestVersion;
|
||||||
};
|
};
|
||||||
@@ -998,12 +1057,12 @@ int main(void) {
|
|||||||
auto *write = new (arena) ConflictSet::WriteRange[kNumKeys];
|
auto *write = new (arena) ConflictSet::WriteRange[kNumKeys];
|
||||||
for (int i = 0; i < kNumKeys; ++i) {
|
for (int i = 0; i < kNumKeys; ++i) {
|
||||||
write[i].begin = toKey(arena, i);
|
write[i].begin = toKey(arena, i);
|
||||||
write[i].end = toKeyAfter(arena, i);
|
|
||||||
write[i].end.len = 0;
|
write[i].end.len = 0;
|
||||||
write[i].writeVersion = ++writeVersion;
|
write[i].writeVersion = ++writeVersion;
|
||||||
}
|
}
|
||||||
cs.addWrites(write, kNumKeys);
|
cs.addWrites(write, kNumKeys);
|
||||||
refImpl.addWrites(write, kNumKeys);
|
refImpl.addWrites(write, kNumKeys);
|
||||||
|
debugPrintDot(stdout, cs.root);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user