summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/erebos/storage.h10
-rw-r--r--src/storage.cpp14
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<const Priv> p;
- PartialStorage(const std::shared_ptr<const Priv> p): p(p) {}
+ PartialStorage(const std::shared_ptr<const Priv> & p): p(p) {}
};
class Storage : public PartialStorage
@@ -102,7 +102,7 @@ protected:
template<typename T> friend class Head;
template<typename T> friend class WatchedHead;
- Storage(const std::shared_ptr<const Priv> p): PartialStorage(p) {}
+ Storage(const std::shared_ptr<const Priv> & p): PartialStorage(p) {}
std::optional<Ref> headRef(UUID type, UUID id) const;
std::vector<std::tuple<UUID, Ref>> 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<Ref> create(Storage, const Digest &);
- static Ref zcreate(Storage);
+ static std::optional<Ref> 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<Ref> Storage::updateHead(UUID type, UUID id, const Ref & old, const std
int Storage::watchHead(UUID type, UUID wid, const std::function<void(const Ref &)> watcher) const
{
- return p->backend->watchHead(type, [this, wid, watcher] (UUID id, const Digest & dgst) {
+ return p->backend->watchHead(type, [wp = weak_ptr<const Priv>(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<uint8_t> & 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<PartialStorage>(st),
@@ -926,7 +928,7 @@ const PartialStorage & PartialRef::storage() const
return *p->storage;
}
-optional<Ref> Ref::create(Storage st, const Digest & digest)
+optional<Ref> Ref::create(const Storage & st, const Digest & digest)
{
if (!st.p->backend->contains(digest))
return nullopt;
@@ -939,7 +941,7 @@ optional<Ref> Ref::create(Storage st, const Digest & digest)
return Ref(shared_ptr<Priv>(p));
}
-Ref Ref::zcreate(Storage st)
+Ref Ref::zcreate(const Storage & st)
{
auto p = new Priv {
.storage = make_unique<PartialStorage>(st),