20#ifdef BUILD_WITH_COMMON_SYSTEM
22#include <kcenon/common/di/service_container.h>
23#include <kcenon/common/interfaces/executor_interface.h>
24#include <kcenon/common/interfaces/logger_interface.h>
29namespace kcenon::thread::di {
34struct executor_registration_config {
36 size_t worker_count = 0;
39 common::di::service_lifetime lifetime = common::di::service_lifetime::singleton;
68inline common::VoidResult register_executor_services(
69 common::di::IServiceContainer& container,
70 const executor_registration_config& config = {}) {
73 if (container.is_registered<common::interfaces::IExecutor>()) {
74 return common::make_error<std::monostate>(
75 common::di::di_error_codes::already_registered,
76 "IExecutor is already registered",
82 size_t workers = config.worker_count;
84 workers = std::thread::hardware_concurrency();
91 return container.register_factory<common::interfaces::IExecutor>(
92 [workers](common::di::IServiceContainer&) -> std::shared_ptr<common::interfaces::IExecutor> {
93 auto pool = std::make_shared<thread_pool>(workers);
94 return std::make_shared<adapters::thread_pool_executor_adapter>(pool);
118inline common::VoidResult register_executor_instance(
119 common::di::IServiceContainer& container,
120 std::shared_ptr<thread_pool> pool) {
123 return common::make_error<std::monostate>(
124 common::error_codes::INVALID_ARGUMENT,
125 "Cannot register null thread pool instance",
130 auto adapter = std::make_shared<adapters::thread_pool_executor_adapter>(pool);
131 return container.register_instance<common::interfaces::IExecutor>(adapter);
140inline common::VoidResult unregister_executor_services(
141 common::di::IServiceContainer& container) {
143 return container.unregister<common::interfaces::IExecutor>();
175inline common::VoidResult register_logger_instance(
176 common::di::IServiceContainer& container,
177 std::shared_ptr<common::interfaces::ILogger> logger) {
180 return common::make_error<std::monostate>(
181 common::error_codes::INVALID_ARGUMENT,
182 "Cannot register null logger instance",
187 return container.register_instance<common::interfaces::ILogger>(logger);
207inline common::VoidResult register_logger_factory(
208 common::di::IServiceContainer& container,
209 std::function<std::shared_ptr<common::interfaces::ILogger>()> factory,
210 common::di::service_lifetime lifetime = common::di::service_lifetime::singleton) {
213 return common::make_error<std::monostate>(
214 common::error_codes::INVALID_ARGUMENT,
215 "Cannot register null logger factory",
220 return container.register_factory<common::interfaces::ILogger>(
221 [factory = std::move(factory)](common::di::IServiceContainer&) {
234inline bool is_logger_registered(
235 const common::di::IServiceContainer& container) {
237 return container.is_registered<common::interfaces::ILogger>();
246inline common::VoidResult unregister_logger(
247 common::di::IServiceContainer& container) {
249 return container.unregister<common::interfaces::ILogger>();
261inline common::VoidResult register_thread_services(
262 common::di::IServiceContainer& container,
263 const executor_registration_config& executor_config = {}) {
266 auto result = register_executor_services(container, executor_config);
267 if (result.is_err()) {
271 return common::VoidResult::ok({});
Adapter to bridge thread_system pools with common IExecutor interface.
Core thread pool implementation with work stealing and auto-scaling.