| Index: src/Platform.cpp |
| diff --git a/src/Platform.cpp b/src/Platform.cpp |
| index 17cc7ab37930df839c1de2500b4c07df5781597a..2f8c6795aa8dd6e485a2590294dcdef415cc8406 100644 |
| --- a/src/Platform.cpp |
| +++ b/src/Platform.cpp |
| @@ -18,6 +18,7 @@ |
| #include <AdblockPlus/JsEngine.h> |
| #include <AdblockPlus/FilterEngine.h> |
| #include <AdblockPlus/DefaultLogSystem.h> |
| +#include <AdblockPlus/AsyncExecutor.h> |
| #include "DefaultTimer.h" |
| #include "DefaultWebRequest.h" |
| #include "DefaultFileSystem.h" |
| @@ -27,11 +28,6 @@ using namespace AdblockPlus; |
| namespace |
| { |
| - void DummyScheduler(const AdblockPlus::SchedulerTask& task) |
| - { |
| - std::thread(task).detach(); |
| - } |
| - |
| template<typename T> |
| void ValidatePlatformCreationParameter(const std::unique_ptr<T>& param, const char* paramName) |
| { |
| @@ -121,10 +117,34 @@ void Platform::WithLogSystem(const WithLogSystemCallback& callback) |
| namespace |
| { |
| + class SharedAsyncExecutor { |
| + public: |
| + SharedAsyncExecutor() |
| + : executor(new AsyncExecutor()) |
| + { |
| + } |
| + void Dispatch(const std::function<void()>& task) { |
| + std::lock_guard<std::mutex> lock(asyncExecutorMutex); |
| + if (!executor) |
| + return; |
| + executor->Dispatch(task); |
| + } |
| + void Invalidate() { |
| + std::unique_ptr<AsyncExecutor> tmp; |
| + { |
| + std::lock_guard<std::mutex> lock(asyncExecutorMutex); |
| + tmp = move(executor); |
| + } |
| + } |
| + private: |
| + std::mutex asyncExecutorMutex; |
| + std::unique_ptr<AsyncExecutor> executor; |
| + }; |
| + |
| class DefaultPlatform : public Platform |
| { |
| public: |
| - typedef std::shared_ptr<Scheduler> AsyncExecutorPtr; |
| + typedef std::shared_ptr<SharedAsyncExecutor> AsyncExecutorPtr; |
| explicit DefaultPlatform(const AsyncExecutorPtr& asyncExecutor, CreationParameters&& creationParams) |
| : Platform(std::move(creationParams)), asyncExecutor(asyncExecutor) |
| { |
| @@ -143,7 +163,7 @@ namespace |
| DefaultPlatform::~DefaultPlatform() |
| { |
| - asyncExecutor.reset(); |
| + asyncExecutor->Invalidate(); |
| LogSystemPtr tmpLogSystem; |
| TimerPtr tmpTimer; |
| FileSystemPtr tmpFileSystem; |
| @@ -184,18 +204,6 @@ namespace |
| Scheduler DefaultPlatformBuilder::GetDefaultAsyncExecutor() |
| { |
| - if (!defaultScheduler) |
| - { |
| - asyncExecutor = std::make_shared<Scheduler>(::DummyScheduler); |
| - std::weak_ptr<Scheduler> weakExecutor = asyncExecutor; |
| - defaultScheduler = [weakExecutor](const SchedulerTask& task) |
| - { |
| - if (auto executor = weakExecutor.lock()) |
| - { |
| - (*executor)(task); |
| - } |
| - }; |
| - } |
| return defaultScheduler; |
| } |
| @@ -223,6 +231,11 @@ void DefaultPlatformBuilder::CreateDefaultLogSystem() |
| std::unique_ptr<Platform> DefaultPlatformBuilder::CreatePlatform() |
| { |
| + auto sharedAsyncExecutor = std::make_shared<SharedAsyncExecutor>(); |
| + defaultScheduler = [sharedAsyncExecutor](const SchedulerTask& task) |
| + { |
| + sharedAsyncExecutor->Dispatch(task); |
| + }; |
| if (!logSystem) |
| CreateDefaultLogSystem(); |
| if (!timer) |
| @@ -232,7 +245,6 @@ std::unique_ptr<Platform> DefaultPlatformBuilder::CreatePlatform() |
| if (!webRequest) |
| CreateDefaultWebRequest(); |
| - std::unique_ptr<Platform> platform(new DefaultPlatform(asyncExecutor, std::move(*this))); |
| - asyncExecutor.reset(); |
| + std::unique_ptr<Platform> platform(new DefaultPlatform(sharedAsyncExecutor, std::move(*this))); |
| return platform; |
| } |