22#include <kcenon/common/interfaces/executor_interface.h>
23#include <kcenon/common/patterns/result.h>
27#include <condition_variable>
43class thread_pool_interface;
65class lambda_job :
public kcenon::common::interfaces::IJob {
78 std::string
name =
"lambda_job",
80 :
func_(std::move(func))
92 requires std::is_void_v<std::invoke_result_t<F>>
93 explicit lambda_job(F&& func, std::string
name =
"lambda_job",
int priority = 0)
96 return kcenon::common::VoidResult(std::monostate{});
98 , name_(std::move(
name))
99 , priority_(priority) {}
101 kcenon::common::VoidResult
execute()
override {
103 return kcenon::common::VoidResult(
104 kcenon::common::error_info{-1,
"No function provided",
"executor"});
109 [[nodiscard]] std::string
get_name()
const override {
return name_; }
152 std::shared_ptr<kcenon::thread::thread_pool> pool);
187 std::unique_ptr<kcenon::common::interfaces::IJob>&& job)
override;
197 std::unique_ptr<kcenon::common::interfaces::IJob>&& job,
198 std::chrono::milliseconds delay)
override;
203 [[nodiscard]] std::size_t worker_count()
const override;
208 [[nodiscard]]
bool is_running()
const override;
213 [[nodiscard]] std::size_t pending_tasks()
const override;
220 void shutdown(
bool wait_for_completion =
true)
override;
236 template <
typename F>
237 requires std::invocable<F>
238 [[nodiscard]]
auto submit(F&& func, std::string
name =
"submitted_job")
240 auto job = std::make_unique<lambda_job>(std::forward<F>(func), std::move(
name));
241 return execute(std::move(job));
247 [[nodiscard]]
auto get_underlying_pool() const
248 -> std::shared_ptr<
kcenon::thread::thread_pool>;
251 std::shared_ptr<
kcenon::thread::thread_pool> pool_;
252 std::atomic<
bool> running_{
true};
253 std::atomic<std::size_t> pending_count_{0};
259 std::atomic<bool> shutdown_requested_{
false};
266 return execute_at > other.execute_at;
269 std::priority_queue<delayed_task, std::vector<delayed_task>,
282[[nodiscard]] std::shared_ptr<kcenon::common::interfaces::IExecutor>
283make_executor(std::shared_ptr<thread_pool_interface> pool_interface);
IJob implementation that wraps a callable.
int get_priority() const override
lambda_job(job_function func, std::string name="lambda_job", int priority=0)
Construct a lambda job.
std::function< kcenon::common::VoidResult()> job_function
kcenon::common::VoidResult execute() override
lambda_job(F &&func, std::string name="lambda_job", int priority=0)
Construct from void-returning callable.
std::string get_name() const override
IExecutor implementation using kcenon::thread::thread_pool.
thread_pool_executor_adapter(const thread_pool_executor_adapter &)=delete
std::thread delay_thread_
thread_pool_executor_adapter & operator=(thread_pool_executor_adapter &&)=delete
thread_pool_executor_adapter & operator=(const thread_pool_executor_adapter &)=delete
std::condition_variable delay_cv_
thread_pool_executor_adapter(thread_pool_executor_adapter &&)=delete
std::priority_queue< delayed_task, std::vector< delayed_task >, std::greater< delayed_task > > delayed_tasks_
auto submit(F &&func, std::string name="submitted_job") -> kcenon::common::Result< std::future< void > >
Submit a void-returning callable directly.
std::shared_ptr< kcenon::common::interfaces::IExecutor > make_executor(std::shared_ptr< thread_pool_interface > pool_interface)
Create an IExecutor from a thread_pool_interface.
bool operator>(const delayed_task &other) const
std::chrono::steady_clock::time_point execute_at
std::function< void()> task