From b14d7f039fceaf579f77f152914d7b25d7157e55 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Sat, 25 Mar 2017 09:40:09 -0500 Subject: [PATCH] Single refresh thread --- include/siadrive_api/siaapi.h | 29 +++++++++++++++++------------ src/siadrive_api/siaapi.cpp | 12 +++++++++++- src/siadrive_api/siaconsensus.cpp | 5 +---- src/siadrive_api/siarenter.cpp | 26 ++++++++++++-------------- src/siadrive_api/siawallet.cpp | 5 +---- 5 files changed, 42 insertions(+), 35 deletions(-) diff --git a/include/siadrive_api/siaapi.h b/include/siadrive_api/siaapi.h index ba07863..e8151f2 100644 --- a/include/siadrive_api/siaapi.h +++ b/include/siadrive_api/siaapi.h @@ -112,8 +112,7 @@ public: }; class SIADRIVE_EXPORTABLE _CSiaWallet : - public virtual CSiaBase, - public virtual CAutoThread + public virtual CSiaBase { friend CSiaApi; private: @@ -130,8 +129,8 @@ public: Property(SiaCurrency, UnconfirmedBalance, public, private) Property(SString, ReceiveAddress, public, private) - protected: - virtual void AutoThreadCallback(const CSiaCurl& siaCurl, CSiaDriveConfig* siaDriveConfig) override; + private: + virtual void Refresh(const CSiaCurl& siaCurl, CSiaDriveConfig* siaDriveConfig); public: _SiaApiError Create(const _SiaSeedLanguage& seedLanguage, SString& seed); @@ -141,8 +140,7 @@ public: }; class SIADRIVE_EXPORTABLE _CSiaRenter : - public virtual CSiaBase, - public virtual CAutoThread + public virtual CSiaBase { friend CSiaApi; @@ -158,8 +156,12 @@ public: Property(std::uint64_t, TotalUsedBytes, public, private) Property(std::uint32_t, TotalUploadProgress, public, private) - protected: - virtual void AutoThreadCallback(const CSiaCurl& siaCurl, CSiaDriveConfig* siaDriveConfig) override; + private: + std::shared_ptr<_CSiaFileTree> _fileTree; + std::mutex _fileTreeMutex; + + private: + void Refresh(const CSiaCurl& siaCurl, CSiaDriveConfig* siaDriveConfig); public: _SiaApiError FileExists(const SString& siaPath, bool& exists) const; @@ -168,8 +170,7 @@ public: }; class SIADRIVE_EXPORTABLE _CSiaConsensus : - public virtual CSiaBase, - public virtual CAutoThread + public virtual CSiaBase { friend CSiaApi; @@ -184,8 +185,8 @@ public: Property(bool, Synced, public, private) Property(SString, CurrentBlock, public, private) - protected: - virtual void AutoThreadCallback(const CSiaCurl& siaCurl, CSiaDriveConfig* siaDriveConfig) override; + private: + void Refresh(const CSiaCurl& siaCurl, CSiaDriveConfig* siaDriveConfig); }; public: @@ -201,6 +202,10 @@ private: std::shared_ptr<_CSiaWallet> _wallet; std::shared_ptr<_CSiaRenter> _renter; std::shared_ptr<_CSiaConsensus> _consensus; + std::unique_ptr _refreshThread; + +private: + void Refresh(const CSiaCurl& siaCurl, CSiaDriveConfig* siaDriveConfig); public: static SString FormatToSiaPath(SString path); diff --git a/src/siadrive_api/siaapi.cpp b/src/siadrive_api/siaapi.cpp index 2c3055e..331ef66 100644 --- a/src/siadrive_api/siaapi.cpp +++ b/src/siadrive_api/siaapi.cpp @@ -10,16 +10,26 @@ CSiaApi::CSiaApi(const SiaHostConfig& hostConfig, CSiaDriveConfig* siaDriveConfi _siaDriveConfig(siaDriveConfig), _wallet(new CSiaWallet(_siaCurl, siaDriveConfig)), _renter(new CSiaRenter(_siaCurl, siaDriveConfig)), - _consensus(new CSiaConsensus(_siaCurl, siaDriveConfig)) + _consensus(new CSiaConsensus(_siaCurl, siaDriveConfig)), + _refreshThread(new CAutoThread(_siaCurl, _siaDriveConfig, [this] (const CSiaCurl& siaCurl, CSiaDriveConfig* siaDriveConfig) { this->Refresh(siaCurl, siaDriveConfig); })) { + _refreshThread->StartAutoThread(); } CSiaApi::~CSiaApi() { + _refreshThread->StopAutoThread(); //TODO Make this an option to lock on exit //_wallet->Lock(); } +void CSiaApi::Refresh(const CSiaCurl& siaCurl, CSiaDriveConfig* siaDriveConfig) +{ + this->_wallet->Refresh(siaCurl, siaDriveConfig); + this->_consensus->Refresh(siaCurl, siaDriveConfig); + this->_renter->Refresh(siaCurl, siaDriveConfig); +} + SString CSiaApi::FormatToSiaPath(SString path) { if (path.Length()) diff --git a/src/siadrive_api/siaconsensus.cpp b/src/siadrive_api/siaconsensus.cpp index aa7c7fb..67b9a30 100644 --- a/src/siadrive_api/siaconsensus.cpp +++ b/src/siadrive_api/siaconsensus.cpp @@ -4,20 +4,17 @@ using namespace Sia::Api; CSiaApi::_CSiaConsensus::_CSiaConsensus(const CSiaCurl& siaCurl, CSiaDriveConfig* siaDriveConfig) : CSiaBase(siaCurl, siaDriveConfig), - CAutoThread(siaCurl, siaDriveConfig), _Height(0), _Synced(false), _CurrentBlock(L"") { - StartAutoThread(); } CSiaApi::_CSiaConsensus::~_CSiaConsensus() { - StopAutoThread(); } -void CSiaApi::_CSiaConsensus::AutoThreadCallback(const CSiaCurl& siaCurl, CSiaDriveConfig* siaDriveConfig) +void CSiaApi::_CSiaConsensus::Refresh(const CSiaCurl& siaCurl, CSiaDriveConfig* siaDriveConfig) { json result; if (ApiSuccess(siaCurl.Get(L"/consensus", result))) diff --git a/src/siadrive_api/siarenter.cpp b/src/siadrive_api/siarenter.cpp index 898984e..436cb32 100644 --- a/src/siadrive_api/siarenter.cpp +++ b/src/siadrive_api/siarenter.cpp @@ -47,22 +47,19 @@ using namespace Sia::Api; }*/ CSiaApi::_CSiaRenter::_CSiaRenter(const CSiaCurl& siaCurl, CSiaDriveConfig* siaDriveConfig) : CSiaBase(siaCurl, siaDriveConfig), - CAutoThread(siaCurl, siaDriveConfig), _Funds(0), _Hosts(0), _Unspent(0), _TotalUsedBytes(0), _TotalUploadProgress(100) { - StartAutoThread(); } CSiaApi::_CSiaRenter::~_CSiaRenter() { - StopAutoThread(); } -void CSiaApi::_CSiaRenter::AutoThreadCallback(const CSiaCurl& siaCurl, CSiaDriveConfig* siaDriveConfig) +void CSiaApi::_CSiaRenter::Refresh(const CSiaCurl& siaCurl, CSiaDriveConfig* siaDriveConfig) { json result; if (ApiSuccess(siaCurl.Get(L"/renter", result))) @@ -78,7 +75,11 @@ void CSiaApi::_CSiaRenter::AutoThreadCallback(const CSiaCurl& siaCurl, CSiaDrive if (ApiSuccess(siaCurl.Get(L"/renter/files", result))) { fileTree->BuildTree(result); - + { + std::lock_guard l(_fileTreeMutex); + _fileTree = fileTree; + } + auto fileList = fileTree->GetFileList(); if (fileList.size()) { @@ -142,14 +143,11 @@ SiaApiError CSiaApi::_CSiaRenter::DownloadFile(const SString& siaPath, const SSt SiaApiError CSiaApi::_CSiaRenter::GetFileTree(CSiaFileTreePtr& siaFileTree) const { - SiaApiError ret = SiaApiError::RequestError; - siaFileTree.reset(new CSiaFileTree(GetSiaCurl(), &GetSiaDriveConfig())); - json result; - if (ApiSuccess(GetSiaCurl().Get(L"/renter/files", result))) - { - siaFileTree->BuildTree(result); - ret = SiaApiError::Success; - } + siaFileTree = _fileTree; + if (!siaFileTree) + { + siaFileTree.reset(new CSiaFileTree(GetSiaCurl(), &GetSiaDriveConfig())); + } - return ret; + return SiaApiError::Success; } \ No newline at end of file diff --git a/src/siadrive_api/siawallet.cpp b/src/siadrive_api/siawallet.cpp index 2affea2..d780b51 100644 --- a/src/siadrive_api/siawallet.cpp +++ b/src/siadrive_api/siawallet.cpp @@ -22,19 +22,16 @@ static SString SeedLangToString(const SiaSeedLanguage& lang) CSiaApi::_CSiaWallet::_CSiaWallet(const CSiaCurl& siaCurl, CSiaDriveConfig* siaDriveConfig) : CSiaBase(siaCurl, siaDriveConfig), - CAutoThread(siaCurl, siaDriveConfig), _Created(false), _Locked(false), _Connected(false), _ConfirmedBalance(0), _UnconfirmedBalance(0) { - StartAutoThread(); } CSiaApi::_CSiaWallet::~_CSiaWallet() { - StopAutoThread(); } /*{ @@ -48,7 +45,7 @@ CSiaApi::_CSiaWallet::~_CSiaWallet() "siafundbalance": "1", // siafunds, big int "siacoinclaimbalance": "9001", // hastings, big int }*/ -void CSiaApi::_CSiaWallet::AutoThreadCallback(const CSiaCurl& siaCurl, CSiaDriveConfig* siaDriveConfig) +void CSiaApi::_CSiaWallet::Refresh(const CSiaCurl& siaCurl, CSiaDriveConfig* siaDriveConfig) { bool locked = false; bool created = false;