| Index: src/Platform.cpp |
| diff --git a/src/Platform.cpp b/src/Platform.cpp |
| index 17cc7ab37930df839c1de2500b4c07df5781597a..e53ae974a75efeec09e8ac42adc629adda5a47b6 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,11 +117,35 @@ void Platform::WithLogSystem(const WithLogSystemCallback& callback) |
| namespace |
| { |
| + class SharedAsyncExecutor { |
|
sergei
2018/02/23 11:16:42
It's rather a compatibility thing to simplify the
|
| + 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; |
|
sergei
2018/02/23 11:16:42
JIC, it's needed to prevent dead locks. If `execut
|
| + { |
| + 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; |
| - explicit DefaultPlatform(const AsyncExecutorPtr& asyncExecutor, CreationParameters&& creationParams) |
| + typedef std::shared_ptr<SharedAsyncExecutor> AsyncExecutorPtr; |
| + explicit DefaultPlatform(const std::shared_ptr<SharedAsyncExecutor>& asyncExecutor, CreationParameters&& creationParams) |
|
hub
2018/02/23 22:59:35
Since there is `typedef std::shared_ptr<SharedAsyn
sergei
2018/03/01 11:18:37
Fixed, I somehow forgot about it ))
|
| : Platform(std::move(creationParams)), asyncExecutor(asyncExecutor) |
| { |
| } |
| @@ -137,13 +157,13 @@ namespace |
| void WithLogSystem(const WithLogSystemCallback&) override; |
| private: |
| - AsyncExecutorPtr asyncExecutor; |
| + std::shared_ptr<SharedAsyncExecutor> asyncExecutor; |
| std::recursive_mutex interfacesMutex; |
| }; |
| 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; |
| } |