36#if LOGGER_HAS_IEXECUTOR
38#if __has_include(<kcenon/common/interfaces/executor_interface.h>)
39#include <kcenon/common/interfaces/executor_interface.h>
40#include <kcenon/common/patterns/result.h>
41#elif __has_include(<common/interfaces/executor_interface.h>)
42#include <common/interfaces/executor_interface.h>
43#include <common/patterns/result.h>
48#include <condition_variable>
64class function_job :
public common::interfaces::IJob {
66 explicit function_job(std::function<
void()> func, std::string name =
"logger_task")
67 : func_(std::move(func)), name_(std::move(name)) {}
73 }
catch (
const std::exception& ex) {
75 -1, ex.what(),
"standalone_executor"
79 -1,
"Unknown exception during job execution",
"standalone_executor"
84 std::string get_name()
const override {
return name_; }
87 std::function<void()> func_;
118class LOGGER_SYSTEM_API standalone_executor :
public common::interfaces::IExecutor {
125 explicit standalone_executor(std::size_t queue_size = 8192,
126 std::string name =
"standalone_executor");
131 ~standalone_executor()
override;
134 standalone_executor(
const standalone_executor&) =
delete;
135 standalone_executor& operator=(
const standalone_executor&) =
delete;
136 standalone_executor(standalone_executor&&) =
delete;
137 standalone_executor& operator=(standalone_executor&&) =
delete;
154 std::unique_ptr<common::interfaces::IJob>&& job)
override;
163 std::unique_ptr<common::interfaces::IJob>&& job,
164 std::chrono::milliseconds delay)
override;
170 size_t worker_count()
const override;
176 bool is_running()
const override;
182 size_t pending_tasks()
const override;
188 void shutdown(
bool wait_for_completion =
true)
override;
196 [[nodiscard]] std::string get_name() const noexcept {
return name_; }
202 [[nodiscard]] std::uint64_t dropped_count() const noexcept;
208 struct pending_task {
209 std::unique_ptr<common::interfaces::IJob> job;
210 std::shared_ptr<std::promise<void>> completion_promise;
211 std::chrono::steady_clock::time_point execute_after;
229 bool enqueue_task(pending_task&& task);
232 const std::string name_;
233 const std::size_t queue_size_;
235 std::queue<pending_task> queue_;
236 mutable std::mutex queue_mutex_;
237 std::condition_variable queue_cv_;
239 std::thread worker_thread_;
240 std::atomic<bool> running_{
false};
241 std::atomic<bool> stop_requested_{
false};
242 std::atomic<std::uint64_t> dropped_count_{0};
256 static std::shared_ptr<common::interfaces::IExecutor> create(
257 std::size_t queue_size = 8192,
258 const std::string& name =
"standalone_executor");
DLL export/import macros for logger_system shared library support.
#define LOGGER_SYSTEM_API
Conditionally enables thread_system integration when available.