Add definable timeout for SyncStorage APIs
[ric-plt/sdl.git] / include / private / syncstorageimpl.hpp
index db762e0..735274f 100644 (file)
 #ifndef SHAREDDATALAYER_SYNCSTORAGEIMPL_HPP_
 #define SHAREDDATALAYER_SYNCSTORAGEIMPL_HPP_
 
+#include <sdl/asyncstorage.hpp>
 #include <sdl/syncstorage.hpp>
+#include <sys/poll.h>
 #include <system_error>
 
 namespace shareddatalayer
 {
-    class AsyncStorage;
-
     class System;
 
     class SyncStorageImpl: public SyncStorage
@@ -39,38 +39,50 @@ namespace shareddatalayer
         SyncStorageImpl(std::unique_ptr<AsyncStorage> asyncStorage,
                         System& system);
 
-        void set(const Namespace& ns, const DataMap& dataMap) override;
+        virtual void set(const Namespace& ns, const DataMap& dataMap) override;
+
+        virtual bool setIf(const Namespace& ns, const Key& key, const Data& oldData, const Data& newData) override;
 
-        bool setIf(const Namespace& ns, const Key& key, const Data& oldData, const Data& newData) override;
+        virtual bool setIfNotExists(const Namespace& ns, const Key& key, const Data& data) override;
 
-        bool setIfNotExists(const Namespace& ns, const Key& key, const Data& data) override;
+        virtual DataMap get(const Namespace& ns, const Keys& keys) override;
 
-        DataMap get(const Namespace& ns, const Keys& keys) override;
+        virtual void remove(const Namespace& ns, const Keys& keys) override;
 
-        void remove(const Namespace& ns, const Keys& keys) override;
+        virtual bool removeIf(const Namespace& ns, const Key& key, const Data& data) override;
 
-        bool removeIf(const Namespace& ns, const Key& key, const Data& data) override;
+        virtual Keys findKeys(const Namespace& ns, const std::string& keyPrefix) override;
 
-        Keys findKeys(const Namespace& ns, const std::string& keyPrefix) override;
+        virtual void removeAll(const Namespace& ns) override;
 
-        void removeAll(const Namespace& ns) override;
+        virtual void setOperationTimeout(const std::chrono::steady_clock::duration& timeout) override;
+
+        static constexpr int NO_TIMEOUT = -1;
 
     private:
         std::unique_ptr<AsyncStorage> asyncStorage;
         System& system;
-        int pFd;
         DataMap localMap;
         Keys localKeys;
         bool localStatus;
         std::error_code localError;
         bool synced;
+        bool isReady;
+        struct pollfd events;
+        std::chrono::steady_clock::duration operationTimeout;
 
         void verifyBackendResponse();
 
-        void waitForCallback();
+        void pollAndHandleEvents(int timeout_ms);
+
+        void waitForReadinessCheckCallback();
+
+        void waitForOperationCallback();
 
         void waitSdlToBeReady(const Namespace& ns);
 
+        void waitReadyAck(const std::error_code& error);
+
         void modifyAck(const std::error_code& error);
 
         void modifyIfAck(const std::error_code& error, bool status);
@@ -78,6 +90,8 @@ namespace shareddatalayer
         void getAck(const std::error_code& error, const DataMap& dataMap);
 
         void findKeysAck(const std::error_code& error, const Keys& keys);
+
+        void handlePendingEvents();
     };
 }