summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/network.cpp2
-rw-r--r--src/state.cpp12
-rw-r--r--src/storage.cpp10
-rw-r--r--src/sync.cpp39
4 files changed, 36 insertions, 27 deletions
diff --git a/src/network.cpp b/src/network.cpp
index 259ae5e..8ee61b3 100644
--- a/src/network.cpp
+++ b/src/network.cpp
@@ -24,6 +24,8 @@ using namespace erebos;
Server::Server(const Head<LocalState> & head, vector<unique_ptr<Service>> && svcs):
p(new Priv(head, *head->identity(), std::move(svcs)))
{
+ for (const auto & s : p->services)
+ s->serverStarted(*this);
}
Server:: Server(const std::shared_ptr<Priv> & ptr):
diff --git a/src/state.cpp b/src/state.cpp
index 6e39b5e..1a3381a 100644
--- a/src/state.cpp
+++ b/src/state.cpp
@@ -153,3 +153,15 @@ Ref SharedState::store(const Storage & st) const
return st.storeObject(Record(std::move(items)));
}
+
+template<>
+optional<Identity> LocalState::lens<optional<Identity>>(const LocalState & x)
+{
+ return x.identity();
+}
+
+template<>
+vector<Ref> LocalState::lens<vector<Ref>>(const LocalState & x)
+{
+ return x.sharedRefs();
+}
diff --git a/src/storage.cpp b/src/storage.cpp
index bd0beae..f68cb68 100644
--- a/src/storage.cpp
+++ b/src/storage.cpp
@@ -928,6 +928,16 @@ const PartialStorage & PartialRef::storage() const
return *p->storage;
}
+bool Ref::operator==(const Ref & other) const
+{
+ return p->digest == other.p->digest;
+}
+
+bool Ref::operator!=(const Ref & other) const
+{
+ return p->digest != other.p->digest;
+}
+
optional<Ref> Ref::create(const Storage & st, const Digest & digest)
{
if (!st.p->backend->contains(digest))
diff --git a/src/sync.cpp b/src/sync.cpp
index 37f7ca9..cf423ac 100644
--- a/src/sync.cpp
+++ b/src/sync.cpp
@@ -38,40 +38,25 @@ void SyncService::serverStarted(const Server & s)
server = &s;
server->peerList().onUpdate(std::bind(&SyncService::peerWatcher, this,
std::placeholders::_1, std::placeholders::_2));
- watchedHead = server->localHead().watch(std::bind(&SyncService::localStateWatcher, this,
+ watchedLocal = server->localState().lens<vector<Ref>>().watch(std::bind(&SyncService::localStateWatcher, this,
std::placeholders::_1));
}
void SyncService::peerWatcher(size_t, const Peer * peer)
{
- if (peer && peer->identity()->finalOwner().sameAs(
- server->identity().finalOwner())) {
- scoped_lock lock(headMutex);
- for (const auto & r : (*watchedHead)->sharedRefs())
- peer->send(myUUID, r);
+ if (peer) {
+ if (auto id = peer->identity()) {
+ if (id->finalOwner().sameAs(server->identity().finalOwner()))
+ for (const auto & r : server->localState().get().sharedRefs())
+ peer->send(myUUID, r);
+ }
}
}
-void SyncService::localStateWatcher(const Head<LocalState> & head)
+void SyncService::localStateWatcher(const vector<Ref> & refs)
{
- scoped_lock lock(headMutex);
-
- bool same = head->sharedRefs().size() ==
- (*watchedHead)->sharedRefs().size();
- if (same) {
- for (size_t i = 0; i < head->sharedRefs().size(); i++)
- if (head->sharedRefs()[i].digest() !=
- (*watchedHead)->sharedRefs()[i].digest()) {
- same = false;
- break;
- }
- }
-
- if (!same) {
- *watchedHead = head;
- const auto & plist = server->peerList();
- for (size_t i = 0; i < plist.size(); i++)
- for (const auto & r : (*watchedHead)->sharedRefs())
- plist.at(i).send(myUUID, r);
- }
+ const auto & plist = server->peerList();
+ for (size_t i = 0; i < plist.size(); i++)
+ for (const auto & r : refs)
+ plist.at(i).send(myUUID, r);
}