From 7bf4de9f39dbc058cc61f5a979bcd30bc1be6761 Mon Sep 17 00:00:00 2001 From: Alexander Shalamov Date: Wed, 22 Jan 2020 17:16:34 +0200 Subject: [core] Move resource loader to dedicated thread with scheduler --- .../src/mbgl/storage/main_resource_loader.cpp | 123 ++++++++------------- 1 file changed, 48 insertions(+), 75 deletions(-) (limited to 'platform') diff --git a/platform/default/src/mbgl/storage/main_resource_loader.cpp b/platform/default/src/mbgl/storage/main_resource_loader.cpp index e39ca8ef47..91ae0a1d71 100644 --- a/platform/default/src/mbgl/storage/main_resource_loader.cpp +++ b/platform/default/src/mbgl/storage/main_resource_loader.cpp @@ -6,59 +6,23 @@ #include #include #include +#include #include namespace mbgl { -class ResourceLoaderRequestor { +class MainResourceLoaderThread { public: - explicit ResourceLoaderRequestor(MainResourceLoader::Impl& impl_); - void request(AsyncRequest*, Resource, ActorRef); - void cancel(AsyncRequest*); - void pause(); - void resume(); - -private: - MainResourceLoader::Impl& impl; -}; - -class MainResourceLoader::Impl { -public: - Impl(std::shared_ptr assetFileSource_, - std::shared_ptr databaseFileSource_, - std::shared_ptr localFileSource_, - std::shared_ptr onlineFileSource_) + MainResourceLoaderThread(std::shared_ptr assetFileSource_, + std::shared_ptr databaseFileSource_, + std::shared_ptr localFileSource_, + std::shared_ptr onlineFileSource_) : assetFileSource(std::move(assetFileSource_)), databaseFileSource(std::move(databaseFileSource_)), localFileSource(std::move(localFileSource_)), - onlineFileSource(std::move(onlineFileSource_)), - supportsCacheOnlyRequests_(bool(databaseFileSource)), - requestor(std::make_unique>(*Scheduler::GetCurrent(), *this)) {} - - std::unique_ptr request(const Resource& resource, Callback callback) { - auto req = std::make_unique(std::move(callback)); - req->onCancel([actorRef = requestor->self(), req = req.get()]() { - actorRef.invoke(&ResourceLoaderRequestor::cancel, req); - }); - requestor->self().invoke(&ResourceLoaderRequestor::request, req.get(), resource, req->actor()); - return std::move(req); - } + onlineFileSource(std::move(onlineFileSource_)) {} - bool canRequest(const Resource& resource) const { - return (assetFileSource && assetFileSource->canRequest(resource)) || - (localFileSource && localFileSource->canRequest(resource)) || - (databaseFileSource && databaseFileSource->canRequest(resource)) || - (onlineFileSource && onlineFileSource->canRequest(resource)); - } - - bool supportsCacheOnlyRequests() const { return supportsCacheOnlyRequests_; } - - void pause() { requestor->self().invoke(&ResourceLoaderRequestor::pause); } - - void resume() { requestor->self().invoke(&ResourceLoaderRequestor::resume); } - -private: void request(AsyncRequest* req, Resource resource, ActorRef ref) { auto callback = [ref](const Response& res) { ref.invoke(&FileSourceRequest::setResponse, res); }; @@ -142,55 +106,64 @@ private: } } - void pauseInternal() { - if (assetFileSource) assetFileSource->pause(); - if (databaseFileSource) databaseFileSource->pause(); - if (localFileSource) localFileSource->pause(); - if (onlineFileSource) onlineFileSource->pause(); - } - - void resumeInternal() { - if (assetFileSource) assetFileSource->resume(); - if (databaseFileSource) databaseFileSource->resume(); - if (localFileSource) localFileSource->resume(); - if (onlineFileSource) onlineFileSource->resume(); - } - void cancel(AsyncRequest* req) { assert(req); tasks.erase(req); } private: - friend class ResourceLoaderRequestor; const std::shared_ptr assetFileSource; const std::shared_ptr databaseFileSource; const std::shared_ptr localFileSource; const std::shared_ptr onlineFileSource; - const bool supportsCacheOnlyRequests_; - std::unique_ptr> requestor; std::unordered_map> tasks; }; -ResourceLoaderRequestor::ResourceLoaderRequestor(MainResourceLoader::Impl& impl_) : impl(impl_) {} +class MainResourceLoader::Impl { +public: + Impl(std::shared_ptr assetFileSource_, + std::shared_ptr databaseFileSource_, + std::shared_ptr localFileSource_, + std::shared_ptr onlineFileSource_) + : assetFileSource(std::move(assetFileSource_)), + databaseFileSource(std::move(databaseFileSource_)), + localFileSource(std::move(localFileSource_)), + onlineFileSource(std::move(onlineFileSource_)), + supportsCacheOnlyRequests_(bool(databaseFileSource)), + thread(std::make_unique>( + "ResourceLoaderThread", assetFileSource, databaseFileSource, localFileSource, onlineFileSource)) {} + + std::unique_ptr request(const Resource& resource, Callback callback) { + auto req = std::make_unique(std::move(callback)); -void ResourceLoaderRequestor::request(AsyncRequest* req, Resource resource, ActorRef ref) { - assert(req); - impl.request(req, std::move(resource), std::move(ref)); -} + req->onCancel([actorRef = thread->actor(), req = req.get()]() { + actorRef.invoke(&MainResourceLoaderThread::cancel, req); + }); + thread->actor().invoke(&MainResourceLoaderThread::request, req.get(), resource, req->actor()); + return std::move(req); + } -void ResourceLoaderRequestor::cancel(AsyncRequest* req) { - assert(req); - impl.cancel(req); -} + bool canRequest(const Resource& resource) const { + return (assetFileSource && assetFileSource->canRequest(resource)) || + (localFileSource && localFileSource->canRequest(resource)) || + (databaseFileSource && databaseFileSource->canRequest(resource)) || + (onlineFileSource && onlineFileSource->canRequest(resource)); + } -void ResourceLoaderRequestor::pause() { - impl.pauseInternal(); -} + bool supportsCacheOnlyRequests() const { return supportsCacheOnlyRequests_; } -void ResourceLoaderRequestor::resume() { - impl.resumeInternal(); -} + void pause() { thread->pause(); } + + void resume() { thread->resume(); } + +private: + const std::shared_ptr assetFileSource; + const std::shared_ptr databaseFileSource; + const std::shared_ptr localFileSource; + const std::shared_ptr onlineFileSource; + const bool supportsCacheOnlyRequests_; + const std::unique_ptr> thread; +}; MainResourceLoader::MainResourceLoader(const ResourceOptions& options) : impl(std::make_unique(FileSourceManager::get()->getFileSource(FileSourceType::Asset, options), -- cgit v1.2.1