Crash fix
Two fixes really: 1. fix some parent pointers being wrong 2. fix notebooks being destroyed while node tree is still valid
This commit is contained in:
parent
fe7c5c5bc1
commit
6b9556e711
3 changed files with 66 additions and 7 deletions
7
main.cpp
7
main.cpp
|
@ -45,12 +45,13 @@ int main (int argc, char* argv[]) {
|
||||||
using std::string_view;
|
using std::string_view;
|
||||||
|
|
||||||
QApplication app(argc, argv);
|
QApplication app(argc, argv);
|
||||||
duck::MainWindow win;
|
|
||||||
win.show();
|
|
||||||
|
|
||||||
std::vector<duck::Node> roots = duck::build_notebook_tree(BASE_PATH);
|
duck::Notebooks notebooks(BASE_PATH);
|
||||||
|
std::vector<duck::Node> roots = notebooks.build_tree();
|
||||||
std::vector<const duck::NotebookInfo*> dele_list = duck::make_list_of_deleted(roots);
|
std::vector<const duck::NotebookInfo*> dele_list = duck::make_list_of_deleted(roots);
|
||||||
|
|
||||||
|
duck::MainWindow win(&roots.back());
|
||||||
|
win.show();
|
||||||
for (const duck::NotebookInfo* nb : dele_list) {
|
for (const duck::NotebookInfo* nb : dele_list) {
|
||||||
for (const auto& f : nb->files) {
|
for (const auto& f : nb->files) {
|
||||||
std::cout << "/home/root/.local/share/remarkable/xochitl/" << f << '\n';
|
std::cout << "/home/root/.local/share/remarkable/xochitl/" << f << '\n';
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <simdjson.h>
|
#include <simdjson.h>
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
namespace fs = std::filesystem;
|
namespace fs = std::filesystem;
|
||||||
|
|
||||||
|
@ -69,6 +70,17 @@ NotebookMapType build_notebook_infos (
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void assert_parents_correct (const Node* node) {
|
||||||
|
#if !defined(NDEBUG)
|
||||||
|
for (const auto& child : node->children) {
|
||||||
|
assert(child.parent == node);
|
||||||
|
assert_parents_correct(&child);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static_cast<void>(node);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<Node> to_tree (const NotebookMapType& nbs) {
|
std::vector<Node> to_tree (const NotebookMapType& nbs) {
|
||||||
std::unordered_map<std::string_view, std::pair<unsigned int, Node>> parents;
|
std::unordered_map<std::string_view, std::pair<unsigned int, Node>> parents;
|
||||||
for (const auto& nb : nbs) {
|
for (const auto& nb : nbs) {
|
||||||
|
@ -102,15 +114,27 @@ std::vector<Node> to_tree (const NotebookMapType& nbs) {
|
||||||
if (node.info) {
|
if (node.info) {
|
||||||
auto it_parent = parents.find(node.info->parent);
|
auto it_parent = parents.find(node.info->parent);
|
||||||
Node* dst_node = (parents.end() == it_parent ? grouped_nodes[node.info->parent] : &it_parent->second.second);
|
Node* dst_node = (parents.end() == it_parent ? grouped_nodes[node.info->parent] : &it_parent->second.second);
|
||||||
|
node.parent = dst_node;
|
||||||
|
assert(dst_node->children.capacity() > dst_node->children.size());
|
||||||
dst_node->children.push_back(std::move(node));
|
dst_node->children.push_back(std::move(node));
|
||||||
|
for (auto& child : dst_node->children.back().children) {
|
||||||
|
child.parent = &dst_node->children.back();
|
||||||
|
}
|
||||||
grouped_nodes[dst_node->children.back().name] = &dst_node->children.back();
|
grouped_nodes[dst_node->children.back().name] = &dst_node->children.back();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
node.parent = nullptr;
|
||||||
roots.push_back(std::move(node));
|
roots.push_back(std::move(node));
|
||||||
grouped_nodes[node.name] = &roots.back();
|
grouped_nodes[node.name] = &roots.back();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (auto& root : roots) {
|
||||||
|
for (auto& child : root.children) {
|
||||||
|
child.parent = &root;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return roots;
|
return roots;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -136,9 +160,24 @@ std::vector<const NotebookInfo*> make_dele_list (const Node& tree) {
|
||||||
}
|
}
|
||||||
} //unnamed namespace
|
} //unnamed namespace
|
||||||
|
|
||||||
std::vector<Node> build_notebook_tree (std::string_view base_path) {
|
struct Notebooks::LocalData {
|
||||||
auto notebooks = build_notebook_infos(base_path);
|
NotebookMapType nb_map;
|
||||||
return to_tree(notebooks);
|
};
|
||||||
|
|
||||||
|
Notebooks::Notebooks (std::string_view base_path) :
|
||||||
|
m_local(std::make_unique<LocalData>())
|
||||||
|
{
|
||||||
|
m_local->nb_map = build_notebook_infos(base_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
Notebooks::~Notebooks() noexcept = default;
|
||||||
|
|
||||||
|
std::vector<Node> Notebooks::build_tree() const {
|
||||||
|
auto tree = to_tree(m_local->nb_map);
|
||||||
|
for (const auto& root : tree) {
|
||||||
|
assert_parents_correct(&root);
|
||||||
|
}
|
||||||
|
return tree; //to_tree(m_local->nb_map);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<const NotebookInfo*> make_list_of_deleted (const std::vector<Node>& roots) {
|
std::vector<const NotebookInfo*> make_list_of_deleted (const std::vector<Node>& roots) {
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
namespace duck {
|
namespace duck {
|
||||||
struct NotebookInfo {
|
struct NotebookInfo {
|
||||||
|
@ -40,6 +41,12 @@ struct Node {
|
||||||
parent(nullptr)
|
parent(nullptr)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
Node (const Node&) = delete;
|
||||||
|
Node (Node&& other) = default;
|
||||||
|
|
||||||
|
Node& operator= (const Node&) = delete;
|
||||||
|
Node& operator= (Node&&) = default;
|
||||||
|
|
||||||
Node (std::string_view name, const NotebookInfo* payload, Node* parent) :
|
Node (std::string_view name, const NotebookInfo* payload, Node* parent) :
|
||||||
name(name),
|
name(name),
|
||||||
info(payload),
|
info(payload),
|
||||||
|
@ -52,6 +59,18 @@ struct Node {
|
||||||
const Node* parent;
|
const Node* parent;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<Node> build_notebook_tree (std::string_view base_path);
|
class Notebooks {
|
||||||
|
public:
|
||||||
|
Notebooks (std::string_view base_path);
|
||||||
|
~Notebooks() noexcept;
|
||||||
|
|
||||||
|
std::vector<Node> build_tree() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
struct LocalData;
|
||||||
|
|
||||||
|
std::unique_ptr<LocalData> m_local;
|
||||||
|
};
|
||||||
|
|
||||||
std::vector<const NotebookInfo*> make_list_of_deleted (const std::vector<Node>& roots);
|
std::vector<const NotebookInfo*> make_list_of_deleted (const std::vector<Node>& roots);
|
||||||
} //namespace duck
|
} //namespace duck
|
||||||
|
|
Loading…
Add table
Reference in a new issue