From 52db636c108ab0a16ba0ccf8df55cf28142a230c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Smr=C5=BE?= Date: Fri, 19 Feb 2021 22:17:22 +0100 Subject: Storage: keep weak pointer to Storage in head watcher --- include/erebos/storage.h | 10 +++++----- src/storage.cpp | 14 ++++++++------ 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/include/erebos/storage.h b/include/erebos/storage.h index 10ced57..75b8139 100644 --- a/include/erebos/storage.h +++ b/include/erebos/storage.h @@ -60,7 +60,7 @@ protected: friend erebos::PartialRef; struct Priv; const std::shared_ptr p; - PartialStorage(const std::shared_ptr p): p(p) {} + PartialStorage(const std::shared_ptr & p): p(p) {} }; class Storage : public PartialStorage @@ -102,7 +102,7 @@ protected: template friend class Head; template friend class WatchedHead; - Storage(const std::shared_ptr p): PartialStorage(p) {} + Storage(const std::shared_ptr & p): PartialStorage(p) {} std::optional headRef(UUID type, UUID id) const; std::vector> headRefs(UUID type) const; @@ -156,7 +156,7 @@ public: PartialRef & operator=(const PartialRef &) = default; PartialRef & operator=(PartialRef &&) = default; - static PartialRef create(PartialStorage, const Digest &); + static PartialRef create(const PartialStorage &, const Digest &); const Digest & digest() const; @@ -184,8 +184,8 @@ public: bool operator==(const Ref &) = delete; bool operator!=(const Ref &) = delete; - static std::optional create(Storage, const Digest &); - static Ref zcreate(Storage); + static std::optional create(const Storage &, const Digest &); + static Ref zcreate(const Storage &); explicit constexpr operator bool() const { return true; } const Object operator*() const; diff --git a/src/storage.cpp b/src/storage.cpp index f50b471..bd0beae 100644 --- a/src/storage.cpp +++ b/src/storage.cpp @@ -37,6 +37,7 @@ using std::shared_ptr; using std::string; using std::system_error; using std::to_string; +using std::weak_ptr; FilesystemStorage::FilesystemStorage(const fs::path & path): root(path) @@ -832,10 +833,11 @@ optional Storage::updateHead(UUID type, UUID id, const Ref & old, const std int Storage::watchHead(UUID type, UUID wid, const std::function watcher) const { - return p->backend->watchHead(type, [this, wid, watcher] (UUID id, const Digest & dgst) { + return p->backend->watchHead(type, [wp = weak_ptr(p), wid, watcher] (UUID id, const Digest & dgst) { if (id == wid) - if (auto r = ref(dgst)) - watcher(*r); + if (auto p = wp.lock()) + if (auto r = Ref::create(Storage(p), dgst)) + watcher(*r); }); } @@ -889,7 +891,7 @@ Digest Digest::of(const vector & content) } -PartialRef PartialRef::create(PartialStorage st, const Digest & digest) +PartialRef PartialRef::create(const PartialStorage & st, const Digest & digest) { auto p = new Priv { .storage = make_unique(st), @@ -926,7 +928,7 @@ const PartialStorage & PartialRef::storage() const return *p->storage; } -optional Ref::create(Storage st, const Digest & digest) +optional Ref::create(const Storage & st, const Digest & digest) { if (!st.p->backend->contains(digest)) return nullopt; @@ -939,7 +941,7 @@ optional Ref::create(Storage st, const Digest & digest) return Ref(shared_ptr(p)); } -Ref Ref::zcreate(Storage st) +Ref Ref::zcreate(const Storage & st) { auto p = new Priv { .storage = make_unique(st), -- cgit v1.2.3