14#if LOGGER_HAS_IEXECUTOR
19std::atomic<executor_type> executor_integration::current_type_{executor_type::none};
20std::shared_ptr<common::interfaces::IExecutor> executor_integration::executor_{
nullptr};
21std::mutex executor_integration::executor_mutex_{};
24 std::lock_guard<std::mutex> lock(executor_mutex_);
27 executor_ = std::move(executor);
28 current_type_.store(executor_type::external, std::memory_order_release);
29 }
else if (!executor_) {
31 executor_ = create_default_executor();
33 current_type_.store(executor_type::standalone, std::memory_order_release);
37 if (
dynamic_cast<standalone_executor*
>(executor_.get()) !=
nullptr) {
38 current_type_.store(executor_type::standalone, std::memory_order_release);
40 current_type_.store(executor_type::external, std::memory_order_release);
46 std::lock_guard<std::mutex> lock(executor_mutex_);
48 current_type_.store(executor_type::none, std::memory_order_release);
55 return current_type_.load(std::memory_order_acquire) != executor_type::none;
58executor_type executor_integration::get_executor_type() noexcept {
59 return current_type_.load(std::memory_order_acquire);
62void executor_integration::set_executor(std::shared_ptr<common::interfaces::IExecutor> executor) {
63 std::lock_guard<std::mutex> lock(executor_mutex_);
66 executor_ = std::move(executor);
67 if (
dynamic_cast<standalone_executor*
>(executor_.get()) !=
nullptr) {
68 current_type_.store(executor_type::standalone, std::memory_order_release);
70 current_type_.store(executor_type::external, std::memory_order_release);
74 current_type_.store(executor_type::none, std::memory_order_release);
78std::shared_ptr<common::interfaces::IExecutor> executor_integration::get_executor() noexcept {
79 std::lock_guard<std::mutex> lock(executor_mutex_);
88 std::shared_ptr<common::interfaces::IExecutor> executor;
90 std::lock_guard<std::mutex> lock(executor_mutex_);
94 if (!executor || !executor->is_running()) {
98 auto job = std::make_unique<function_job>(std::move(task));
99 auto result = executor->execute(std::move(job));
101 return result.is_ok();
104bool executor_integration::submit_task_delayed(
105 std::function<
void()> task,
106 std::chrono::milliseconds delay_ms) {
112 std::shared_ptr<common::interfaces::IExecutor> executor;
114 std::lock_guard<std::mutex> lock(executor_mutex_);
115 executor = executor_;
118 if (!executor || !executor->is_running()) {
122 auto job = std::make_unique<function_job>(std::move(task));
123 auto result = executor->execute_delayed(std::move(job), delay_ms);
125 return result.is_ok();
129 switch (current_type_.load(std::memory_order_acquire)) {
130 case executor_type::standalone:
132 case executor_type::external:
134 case executor_type::none:
140size_t executor_integration::pending_tasks() noexcept {
141 std::lock_guard<std::mutex> lock(executor_mutex_);
143 return executor_->pending_tasks();
148size_t executor_integration::worker_count() noexcept {
149 std::lock_guard<std::mutex> lock(executor_mutex_);
151 return executor_->worker_count();
156std::shared_ptr<common::interfaces::IExecutor> executor_integration::create_default_executor() {
157 return standalone_executor_factory::create(8192,
"logger_async_executor");
static std::string get_executor_name() noexcept
static void enable() noexcept
static void disable() noexcept
static bool submit_task(std::function< void()>) noexcept
static constexpr bool is_enabled() noexcept
IExecutor-based async integration for logger_system.