14#include "keyple/core/service/cpp/ExecutorService.hpp"
16#include <condition_variable>
21#include "keyple/core/service/AbstractObservableStateAdapter.hpp"
22#include "keyple/core/util/cpp/Thread.hpp"
29using keyple::core::service::AbstractObservableStateAdapter;
30using keyple::core::util::cpp::Thread;
32ExecutorService::ExecutorService()
39ExecutorService::~ExecutorService()
48 std::unique_lock<std::mutex> lock(mMutex);
51 mCondition.wait(lock, [
this] {
return !mPool.empty() || !mRunning; });
54 if (!mRunning && mPool.empty()) {
59 std::shared_ptr<Job> job = mPool.front();
60 mPool.erase(mPool.begin());
69 if (!job->isCancelled()) {
78 }
catch (
const std::exception& e) {
79 mLogger->error(
"Job [%] failed: %\n", job->getName(), e.what());
83 "Job [%] failed with an unknown exception\n",
93ExecutorService::execute(std::shared_ptr<Job> job)
96 std::lock_guard<std::mutex> lock(mMutex);
107 mThread = std::unique_ptr<std::thread>(
108 new std::thread(&ExecutorService::run,
this));
110 mPool.push_back(job);
112 mCondition.notify_one();
116ExecutorService::submit(std::shared_ptr<Job> job)
129ExecutorService::shutdown()
132 std::lock_guard<std::mutex> lock(mMutex);
140 mCondition.notify_one();
142 if (mThread->joinable()) {