From c3d6046b25ef0786b8d2919dfa9db4eb05114501 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Smr=C5=BE?= Date: Sun, 21 Feb 2021 22:16:21 +0100 Subject: Sync service --- include/erebos/service.h | 2 ++ include/erebos/state.h | 5 ++++- include/erebos/storage.h | 8 ++++++-- include/erebos/sync.h | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 include/erebos/sync.h (limited to 'include') diff --git a/include/erebos/service.h b/include/erebos/service.h index cec5ea0..ba06495 100644 --- a/include/erebos/service.h +++ b/include/erebos/service.h @@ -32,6 +32,8 @@ public: virtual UUID uuid() const = 0; virtual void handle(Context &) = 0; + + virtual void serverStarted(const class Server &); }; } diff --git a/include/erebos/state.h b/include/erebos/state.h index 543e03c..b1567b0 100644 --- a/include/erebos/state.h +++ b/include/erebos/state.h @@ -29,6 +29,9 @@ public: template LocalState shared(const Storage & st, const T & x) { return updateShared(T::sharedTypeId, x.store(st)); } + vector sharedRefs() const; + LocalState sharedRefAdd(const Ref &) const; + private: vector lookupShared(UUID) const; LocalState updateShared(UUID, const vector &) const; @@ -47,7 +50,7 @@ template LocalState LocalState::shared(const vector> & v) const { vector refs; - for (const auto x : v) + for (const auto & x : v) refs.push_back(x.ref()); return updateShared(T::sharedTypeId, refs); } diff --git a/include/erebos/storage.h b/include/erebos/storage.h index 75b8139..7ec73ab 100644 --- a/include/erebos/storage.h +++ b/include/erebos/storage.h @@ -507,12 +507,16 @@ class WatchedHead : public Head friend class Head; WatchedHead(const Head & h, int watcherId): Head(h), watcherId(watcherId) {} + int watcherId; + +public: WatchedHead(WatchedHead && h): Head(h), watcherId(h.watcherId) { h.watcherId = -1; } - int watcherId; -public: + WatchedHead & operator=(WatchedHead && h) + { watcherId = h.watcherId; h.watcherId = -1; return *this; } + WatchedHead & operator=(const Head & h) { if (Head::id() != h.id()) throw std::runtime_error("WatchedHead ID mismatch"); diff --git a/include/erebos/sync.h b/include/erebos/sync.h new file mode 100644 index 0000000..0b9ed9a --- /dev/null +++ b/include/erebos/sync.h @@ -0,0 +1,32 @@ +#pragma once + +#include +#include +#include + +#include +#include + +namespace erebos { + +class SyncService : public Service +{ +public: + SyncService(); + virtual ~SyncService(); + + UUID uuid() const override; + void handle(Context &) override; + + void serverStarted(const class Server &) override; + +private: + void peerWatcher(size_t, const class Peer *); + void localStateWatcher(const Head &); + + const class Server * server; + std::mutex headMutex; + std::optional> watchedHead; +}; + +} -- cgit v1.2.3