diff --git a/include/openspace/engine/openspaceengine.h b/include/openspace/engine/openspaceengine.h index ee50957fb7..21977d99f9 100644 --- a/include/openspace/engine/openspaceengine.h +++ b/include/openspace/engine/openspaceengine.h @@ -50,7 +50,6 @@ class ModuleEngine; class NetworkEngine; class ParallelConnection; class RenderEngine; -class ResourceSynchronizer; class Scene; class SyncEngine; class SettingsEngine; @@ -117,7 +116,6 @@ public: SettingsEngine& settingsEngine(); TimeManager& timeManager(); WindowWrapper& windowWrapper(); - ResourceSynchronizer& resourceSynchronizer(); ghoul::fontrendering::FontManager& fontManager(); interaction::NavigationHandler& navigationHandler(); interaction::KeyBindingManager& keyBindingManager(); @@ -189,7 +187,6 @@ private: std::unique_ptr _moduleEngine; std::unique_ptr _networkEngine; std::unique_ptr _parallelConnection; - std::unique_ptr _resourceSynchronizer; std::unique_ptr _renderEngine; std::unique_ptr _settingsEngine; std::unique_ptr _syncEngine; diff --git a/include/openspace/scene/assetsynchronizer.h b/include/openspace/scene/assetsynchronizer.h index 5e37aa6613..f21013e5a4 100644 --- a/include/openspace/scene/assetsynchronizer.h +++ b/include/openspace/scene/assetsynchronizer.h @@ -29,7 +29,6 @@ #include #include -#include #include #include @@ -43,7 +42,7 @@ namespace openspace { -class AssetSynchronizer : public ResourceSyncClient { +class AssetSynchronizer { public: enum class SynchronizationState : int { Unknown, @@ -52,7 +51,7 @@ public: Synchronized }; - AssetSynchronizer(ResourceSynchronizer* resourceSynchronizer); + AssetSynchronizer(); void addAsset(std::shared_ptr asset); void removeAsset(Asset* asset); void syncAsset(Asset* asset); @@ -65,15 +64,11 @@ public: private: bool assetIsSynchronized(Asset* asset); - - struct AssetSynchronization { std::shared_ptr asset; SynchronizationState state; }; - ResourceSynchronizer* _resourceSynchronizer; - std::unordered_map _managedAssets; std::unordered_map _resourceToAssetMap; std::vector _trivialSynchronizations; diff --git a/include/openspace/util/resourcesynchronization.h b/include/openspace/util/resourcesynchronization.h index cfb1126024..e14d70be2e 100644 --- a/include/openspace/util/resourcesynchronization.h +++ b/include/openspace/util/resourcesynchronization.h @@ -38,19 +38,6 @@ class TorrentClient; class ResourceSynchronization; -struct SynchronizationProduct { - ResourceSynchronization* synchronization; -}; - -class SynchronizationJob : public Job { -public: - SynchronizationJob(ResourceSynchronization* synchronization); - void execute() override; - std::shared_ptr product() override; -private: - ResourceSynchronization* _synchronization; -}; - class ResourceSynchronization : public std::enable_shared_from_this { @@ -62,7 +49,10 @@ public: ResourceSynchronization(); virtual ~ResourceSynchronization(); virtual std::string directory() = 0; - virtual void synchronize() = 0; + virtual void start() = 0; + virtual void cancel() = 0; + virtual void clear() = 0; + virtual float nSynchronizedBytes() = 0; virtual float nTotalBytes() = 0; virtual bool nTotalBytesIsKnown() = 0; @@ -72,10 +62,8 @@ public: bool isResolved(); void resolve(); void updateProgress(float t); - std::shared_ptr job(); private: - std::shared_ptr _job; std::atomic _started; std::atomic _resolved; }; diff --git a/include/openspace/util/resourcesynchronizer.h b/include/openspace/util/resourcesynchronizer.h index 89a6f84b06..8958614800 100644 --- a/include/openspace/util/resourcesynchronizer.h +++ b/include/openspace/util/resourcesynchronizer.h @@ -25,43 +25,8 @@ #ifndef __OPENSPACE_CORE___RESOURCESYNCHRONIZER___H__ #define __OPENSPACE_CORE___RESOURCESYNCHRONIZER___H__ -#include -#include - -#include - namespace openspace { -class ResourceSyncClient {}; - -class ResourceSynchronizer { -public: - ResourceSynchronizer(); - - void enqueueSynchronization( - std::shared_ptr sync, - ResourceSyncClient* client); - - void cancelSynchronization( - ResourceSynchronization* sync, - ResourceSyncClient* client); - - std::vector> - finishedSynchronizations(ResourceSyncClient* client); - -private: - std::unordered_map _clientMap; - - std::unordered_map> - _managedSynchronizations; - - std::unordered_map> - _finishedSynchronizations; - - ConcurrentJobManager _jobManager; -}; - - } // namespace openspace #endif // __OPENSPACE_CORE___RESOURCESYNCHRONIZER___H__ diff --git a/modules/sync/syncs/httpsynchronization.cpp b/modules/sync/syncs/httpsynchronization.cpp index ecea5cf5f6..2df385eb13 100644 --- a/modules/sync/syncs/httpsynchronization.cpp +++ b/modules/sync/syncs/httpsynchronization.cpp @@ -106,12 +106,13 @@ std::string HttpSynchronization::directory() { return FileSys.absPath(d); } -void HttpSynchronization::synchronize() { +void HttpSynchronization::start() { if (hasSyncFile()) { resolve(); return; } + // TODO: Do this in a new thread! std::vector listUrls = fileListUrls(); for (const auto& url : listUrls) { if (trySyncFromUrl(url)) { @@ -120,7 +121,13 @@ void HttpSynchronization::synchronize() { } } } - + +void HttpSynchronization::cancel() { +} + +void HttpSynchronization::clear() { +} + std::vector HttpSynchronization::fileListUrls() { std::string query = std::string("?") + QueryKeyIdentifier + "=" + _identifier + "&" + QueryKeyFileVersion + "=" + std::to_string(_version) + diff --git a/modules/sync/syncs/httpsynchronization.h b/modules/sync/syncs/httpsynchronization.h index bb7b4dd963..02a36d4e6d 100644 --- a/modules/sync/syncs/httpsynchronization.h +++ b/modules/sync/syncs/httpsynchronization.h @@ -42,7 +42,10 @@ public: static documentation::Documentation Documentation(); std::string directory() override; - void synchronize() override; + void start() override; + void cancel() override; + void clear() override; + float nSynchronizedBytes() override; float nTotalBytes() override; bool nTotalBytesIsKnown() override; diff --git a/modules/sync/syncs/torrentsynchronization.cpp b/modules/sync/syncs/torrentsynchronization.cpp index 6e059bddd6..f0d31d5401 100644 --- a/modules/sync/syncs/torrentsynchronization.cpp +++ b/modules/sync/syncs/torrentsynchronization.cpp @@ -110,16 +110,19 @@ std::string TorrentSynchronization::directory() { return FileSys.absPath(d); } -void TorrentSynchronization::synchronize() { - _torrentClient->addMagnetLink(_magnetLink, directory()); - - bool hasSyncFile(); - void createSyncFile(); - +void TorrentSynchronization::start() { + size_t torrentId = _torrentClient->addMagnetLink(_magnetLink, directory()); resolve(); return; } +void TorrentSynchronization::cancel() { +} + +void TorrentSynchronization::clear() { +} + + float TorrentSynchronization::nSynchronizedBytes() { return 0; } diff --git a/modules/sync/syncs/torrentsynchronization.h b/modules/sync/syncs/torrentsynchronization.h index 1029afdb05..108dfd7586 100644 --- a/modules/sync/syncs/torrentsynchronization.h +++ b/modules/sync/syncs/torrentsynchronization.h @@ -45,7 +45,9 @@ public: static documentation::Documentation Documentation(); std::string directory() override; - void synchronize() override; + void start() override; + void cancel() override; + void clear() override; float nSynchronizedBytes() override; float nTotalBytes() override; diff --git a/src/engine/openspaceengine.cpp b/src/engine/openspaceengine.cpp index 9a342f4d38..60b04a5e49 100644 --- a/src/engine/openspaceengine.cpp +++ b/src/engine/openspaceengine.cpp @@ -152,7 +152,6 @@ OpenSpaceEngine::OpenSpaceEngine(std::string programName, , _networkEngine(new NetworkEngine) , _parallelConnection(new ParallelConnection) , _renderEngine(new RenderEngine) - , _resourceSynchronizer(new ResourceSynchronizer) , _settingsEngine(new SettingsEngine) , _syncEngine(std::make_unique(4096)) , _timeManager(new TimeManager) @@ -412,7 +411,7 @@ void OpenSpaceEngine::create(int argc, char** argv, // Set up asset loader _engine->_assetManager = std::make_unique( std::make_unique(*OsEng.scriptEngine().luaState(), "${ASSETS}"), - std::make_unique(OsEng._resourceSynchronizer.get()) + std::make_unique() ); //_engine->_globalPropertyNamespace->addPropertySubOwner(_engine->_assetLoader->rootAsset()); } @@ -1480,11 +1479,6 @@ AssetManager& OpenSpaceEngine::assetManager() { return *_assetManager; } -ResourceSynchronizer & OpenSpaceEngine::resourceSynchronizer() { - ghoul_assert(_resourceSynchronizer, "Resource Synchronizer must not be nullptr"); - return *_resourceSynchronizer; -} - ghoul::fontrendering::FontManager& OpenSpaceEngine::fontManager() { ghoul_assert(_fontManager, "Font Manager must not be nullptr"); return *_fontManager; diff --git a/src/scene/assetsynchronizer.cpp b/src/scene/assetsynchronizer.cpp index 55bde7d712..e55df21a5d 100644 --- a/src/scene/assetsynchronizer.cpp +++ b/src/scene/assetsynchronizer.cpp @@ -33,9 +33,7 @@ namespace { } namespace openspace { -AssetSynchronizer::AssetSynchronizer(ResourceSynchronizer* resourceSynchronizer) { - _resourceSynchronizer = resourceSynchronizer; -} +AssetSynchronizer::AssetSynchronizer() {} void AssetSynchronizer::addAsset(std::shared_ptr asset) { _managedAssets.emplace(asset.get(), @@ -55,7 +53,7 @@ void AssetSynchronizer::removeAsset(Asset* asset) { for (const auto& s : resourceSyncs) { _resourceToAssetMap.erase(s.get()); - _resourceSynchronizer->cancelSynchronization(s.get(), this); + s->cancel(); } _managedAssets.erase(asset); @@ -73,7 +71,7 @@ void AssetSynchronizer::syncAsset(Asset* asset) { for (const auto& s : resourceSyncs) { if (!s->isResolved()) { - _resourceSynchronizer->enqueueSynchronization(s, this); + s->start(); } } } @@ -122,11 +120,18 @@ float AssetSynchronizer::assetProgress(Asset* asset) { } std::vector> AssetSynchronizer::getSynchronizedAssets() { - std::vector> syncs = - _resourceSynchronizer->finishedSynchronizations(this); + std::vector> finishedResourceSyncs; + for (auto a : _managedAssets) { + std::vector> syncs = a.first->synchronizations(); + for (auto s : syncs) { + if (s->isResolved()) { + finishedResourceSyncs.push_back(s); + } + } + } std::vector affectedAssets; - for (const auto& sync : syncs) { + for (const auto& sync : finishedResourceSyncs) { const auto& it = _resourceToAssetMap.find(sync.get()); if (it != _resourceToAssetMap.end()) { affectedAssets.push_back(it->second); diff --git a/src/util/resourcesynchronization.cpp b/src/util/resourcesynchronization.cpp index fa331290ca..8b8f8252ec 100644 --- a/src/util/resourcesynchronization.cpp +++ b/src/util/resourcesynchronization.cpp @@ -66,7 +66,7 @@ documentation::Documentation ResourceSynchronization::Documentation() { } ResourceSynchronization::ResourceSynchronization() - : _job(std::make_shared(this)) + : _started(false) , _resolved(false) {} @@ -95,10 +95,6 @@ std::unique_ptr ResourceSynchronization::createFromDict return result; } -std::shared_ptr ResourceSynchronization::job() { - return _job; -} - void ResourceSynchronization::wait() { } @@ -120,20 +116,4 @@ float ResourceSynchronization::progress() { return static_cast(nSynchronizedBytes()) / static_cast(nTotalBytes()); } -// SynchronizationJob methods - -SynchronizationJob::SynchronizationJob(ResourceSynchronization* synchronization) { - _synchronization = synchronization; -} - -void SynchronizationJob::execute() { - _synchronization->synchronize(); -} - -std::shared_ptr SynchronizationJob::product() { - return std::make_shared( - SynchronizationProduct{ _synchronization } - ); -} - } diff --git a/src/util/resourcesynchronizer.cpp b/src/util/resourcesynchronizer.cpp index 9dbd744d47..20fe2f24a1 100644 --- a/src/util/resourcesynchronizer.cpp +++ b/src/util/resourcesynchronizer.cpp @@ -22,69 +22,7 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -#include - -namespace { - size_t NumberOfThreads = 8; -} - namespace openspace { -ResourceSynchronizer::ResourceSynchronizer() - : _jobManager(ThreadPool(NumberOfThreads)) -{} - -void ResourceSynchronizer::enqueueSynchronization( - std::shared_ptr sync, - ResourceSyncClient* client) -{ - _managedSynchronizations.emplace(sync.get(), sync); - _clientMap[sync.get()] = client; - - std::shared_ptr job = sync->job(); - _jobManager.enqueueJob(job); -} - -void ResourceSynchronizer::cancelSynchronization( - ResourceSynchronization* sync, - ResourceSyncClient* client) -{ - _managedSynchronizations.erase(sync); - _clientMap.erase(sync); -} - -std::vector> - ResourceSynchronizer::finishedSynchronizations(ResourceSyncClient* client) -{ - // Fetch all finished jobs - while (_jobManager.numFinishedJobs() > 0) { - std::shared_ptr> j = _jobManager.popFinishedJob(); - ResourceSynchronization* sync = j->product()->synchronization; - const auto it = _clientMap.find(sync); - if (it != _clientMap.end()) { - ResourceSyncClient* c = it->second; - _finishedSynchronizations[c].push_back(sync); - } - } - - // Extract the ones that were queried by the client - const auto finishedIt = _finishedSynchronizations.find(client); - if (finishedIt == _finishedSynchronizations.end()) { - return std::vector>(); - } - - std::vector& rawSyncs = finishedIt->second; - - std::vector> syncs(rawSyncs.size()); - std::transform(rawSyncs.begin(), rawSyncs.end(), syncs.begin(), - [this](ResourceSynchronization* raw) { - return _managedSynchronizations[raw]; - } - ); - - _finishedSynchronizations.erase(finishedIt); - - return syncs; -} } // namespace openspace