Thread System 0.3.1
High-performance C++20 thread pool with work stealing and DAG scheduling
Loading...
Searching...
No Matches
thread_context.h
Go to the documentation of this file.
1
7#pragma once
8
9// BSD 3-Clause License
10// Copyright (c) 2025, 🍀☀🌕🌥 🌊
11// See the LICENSE file in the project root for full license information.
12
13#include <memory>
14#include <optional>
15#include <kcenon/common/interfaces/logger_interface.h>
16#include <kcenon/common/interfaces/global_logger_registry.h>
17#include <kcenon/common/interfaces/monitoring_interface.h>
18#include "service_container.h"
21
22namespace kcenon::thread {
23
24// Type alias for common_system ILogger
25using ILogger = common::interfaces::ILogger;
26
27// Type alias for common_system IMonitor
28using IMonitor = common::interfaces::IMonitor;
29
41public:
46 : logger_(common::interfaces::GlobalLoggerRegistry::instance().get_default_logger())
47 , monitoring_(service_container::global().resolve<common::interfaces::IMonitor>()) {
48 }
49
56 std::shared_ptr<ILogger> logger,
57 std::shared_ptr<IMonitor> monitoring = nullptr)
58 : logger_(std::move(logger))
59 , monitoring_(std::move(monitoring)) {
60 }
61
66 std::shared_ptr<ILogger> logger() const {
67 return logger_;
68 }
69
74 std::shared_ptr<IMonitor> monitoring() const {
75 return monitoring_;
76 }
77
86 void log(common::interfaces::log_level level, const std::string& message) const {
87 // Skip logging during static destruction to prevent SDOF
89 return;
90 }
91 if (logger_) {
92 logger_->log(level, message);
93 }
94 }
95
104 void log(log_level_v2 level, const std::string& message) const {
105 // Skip logging during static destruction to prevent SDOF
107 return;
108 }
109 if (logger_) {
110 logger_->log(to_common_level(level), message);
111 }
112 }
113
123 void log(common::interfaces::log_level level,
124 std::string_view message,
125 const common::source_location& loc = common::source_location::current()) const {
126 // Skip logging during static destruction to prevent SDOF
128 return;
129 }
130 if (logger_) {
131 logger_->log(level, message, loc);
132 }
133 }
134
142 void update_system_metrics(const common::interfaces::system_metrics& metrics) const {
143 // Skip monitoring during static destruction to prevent SDOF
145 return;
146 }
147 if (monitoring_) {
148 std::unordered_map<std::string, std::string> tags{{"component", "system"}};
149 monitoring_->record_metric("cpu_usage_percent", metrics.cpu_usage_percent.value, tags);
150 monitoring_->record_metric("memory_usage_bytes", metrics.memory_usage_bytes.value, tags);
151 monitoring_->record_metric("active_threads", metrics.active_threads.value, tags);
152 monitoring_->record_metric("total_allocations", metrics.total_allocations.value, tags);
153 }
154 }
155
163 void update_thread_pool_metrics(const common::interfaces::thread_pool_metrics& metrics) const {
164 // Skip monitoring during static destruction to prevent SDOF
166 return;
167 }
168 if (monitoring_) {
169 std::unordered_map<std::string, std::string> tags{
170 {"component", "thread_pool"},
171 {"pool_name", metrics.pool_name},
172 {"pool_instance_id", std::to_string(metrics.pool_instance_id)}
173 };
174 monitoring_->record_metric("jobs_completed", metrics.jobs_completed.value, tags);
175 monitoring_->record_metric("jobs_pending", metrics.jobs_pending.value, tags);
176 monitoring_->record_metric("worker_threads", metrics.worker_threads.value, tags);
177 monitoring_->record_metric("idle_threads", metrics.idle_threads.value, tags);
178 monitoring_->record_metric("average_latency_ns", metrics.average_latency_ns.value, tags);
179 monitoring_->record_metric("total_execution_time_ns", metrics.total_execution_time_ns.value, tags);
180 }
181 }
182
192 void update_thread_pool_metrics(const std::string& pool_name,
193 std::uint32_t pool_instance_id,
194 const common::interfaces::thread_pool_metrics& metrics) const {
195 // Skip monitoring during static destruction to prevent SDOF
197 return;
198 }
199 if (monitoring_) {
200 std::unordered_map<std::string, std::string> tags{
201 {"component", "thread_pool"},
202 {"pool_name", pool_name},
203 {"pool_instance_id", std::to_string(pool_instance_id)}
204 };
205 monitoring_->record_metric("jobs_completed", metrics.jobs_completed.value, tags);
206 monitoring_->record_metric("jobs_pending", metrics.jobs_pending.value, tags);
207 monitoring_->record_metric("worker_threads", metrics.worker_threads.value, tags);
208 monitoring_->record_metric("idle_threads", metrics.idle_threads.value, tags);
209 monitoring_->record_metric("average_latency_ns", metrics.average_latency_ns.value, tags);
210 monitoring_->record_metric("total_execution_time_ns", metrics.total_execution_time_ns.value, tags);
211 }
212 }
213
222 void update_worker_metrics(std::size_t worker_id,
223 const common::interfaces::worker_metrics& metrics) const {
224 // Skip monitoring during static destruction to prevent SDOF
226 return;
227 }
228 if (monitoring_) {
229 std::unordered_map<std::string, std::string> tags{
230 {"component", "worker"},
231 {"worker_id", std::to_string(worker_id)}
232 };
233 monitoring_->record_metric("jobs_processed", metrics.jobs_processed.value, tags);
234 monitoring_->record_metric("total_processing_time_ns", metrics.total_processing_time_ns.value, tags);
235 monitoring_->record_metric("idle_time_ns", metrics.idle_time_ns.value, tags);
236 monitoring_->record_metric("context_switches", metrics.context_switches.value, tags);
237 }
238 }
239
247
252 auto get_context_name() const -> std::string {
253 return context_name_;
254 }
255
261 auto set_context_name(const std::string& name) -> bool {
262 context_name_ = name;
263 return true;
264 }
265
270 auto has_logger() const -> bool {
271 return logger_ != nullptr;
272 }
273
278 auto has_monitoring() const -> bool {
279 return monitoring_ != nullptr;
280 }
281
282private:
283 std::shared_ptr<ILogger> logger_;
284 std::shared_ptr<IMonitor> monitoring_;
285 mutable std::string context_name_;
286
290 static common::interfaces::log_level to_common_level(log_level_v2 level) {
291 switch (level) {
292 case log_level_v2::trace: return common::interfaces::log_level::trace;
293 case log_level_v2::debug: return common::interfaces::log_level::debug;
294 case log_level_v2::info: return common::interfaces::log_level::info;
295 case log_level_v2::warn: return common::interfaces::log_level::warning;
296 case log_level_v2::error: return common::interfaces::log_level::error;
297 case log_level_v2::critical: return common::interfaces::log_level::critical;
298 case log_level_v2::off: return common::interfaces::log_level::off;
299 default: return common::interfaces::log_level::info;
300 }
301 }
302};
303
311public:
312 thread_context_builder& with_logger(std::shared_ptr<ILogger> logger) {
313 logger_ = std::move(logger);
314 return *this;
315 }
316
317 thread_context_builder& with_monitoring(std::shared_ptr<IMonitor> monitoring) {
318 monitoring_ = std::move(monitoring);
319 return *this;
320 }
321
323 logger_ = common::interfaces::GlobalLoggerRegistry::instance().get_default_logger();
324 monitoring_ = service_container::global().resolve<common::interfaces::IMonitor>();
325 return *this;
326 }
327
331
332private:
333 std::shared_ptr<ILogger> logger_;
334 std::shared_ptr<IMonitor> monitoring_;
335};
336
337} // namespace kcenon::thread
Modern service container for dependency injection.
static service_container & global()
Get the global service container instance.
std::shared_ptr< Interface > resolve()
Resolve a service.
Builder for thread_context with fluent interface.
thread_context_builder & with_monitoring(std::shared_ptr< IMonitor > monitoring)
thread_context_builder & from_global_registry()
thread_context_builder & with_logger(std::shared_ptr< ILogger > logger)
std::shared_ptr< ILogger > logger_
std::shared_ptr< IMonitor > monitoring_
Context object that provides access to optional services.
std::shared_ptr< ILogger > logger_
std::shared_ptr< ILogger > logger() const
Get the logger service.
static common::interfaces::log_level to_common_level(log_level_v2 level)
Convert log_level_v2 to common::interfaces::log_level.
auto get_context_name() const -> std::string
Get context name.
std::shared_ptr< IMonitor > monitoring() const
Get the monitoring service.
void update_system_metrics(const common::interfaces::system_metrics &metrics) const
Update system metrics if monitoring is available.
void log(common::interfaces::log_level level, const std::string &message) const
Log a message if logger is available.
void log(log_level_v2 level, const std::string &message) const
Log a message if logger is available (v2 API with conversion)
std::shared_ptr< IMonitor > monitoring_
thread_context(std::shared_ptr< ILogger > logger, std::shared_ptr< IMonitor > monitoring=nullptr)
Constructor with explicit service injection.
void update_thread_pool_metrics(const common::interfaces::thread_pool_metrics &metrics) const
Update thread pool metrics if monitoring is available.
void update_worker_metrics(std::size_t worker_id, const common::interfaces::worker_metrics &metrics) const
Update worker metrics if monitoring is available.
thread_context()
Default constructor - resolves services from global registry.
auto has_monitoring() const -> bool
Check if monitoring is available.
void update_thread_pool_metrics(const std::string &pool_name, std::uint32_t pool_instance_id, const common::interfaces::thread_pool_metrics &metrics) const
Update thread pool metrics with pool identifier.
auto set_context_name(const std::string &name) -> bool
Set context name.
auto has_logger() const -> bool
Check if logger is available.
void log(common::interfaces::log_level level, std::string_view message, const common::source_location &loc=common::source_location::current()) const
Log a message with source location if logger is available.
thread_context create_child() const
Create a child context with the same services.
static bool is_shutting_down()
Check if shutdown is in progress.
Logging severity levels for the thread system.
Core threading foundation of the thread system library.
Definition thread_impl.h:17
common::interfaces::ILogger ILogger
log_level_v2
Logging severity levels with explicit ascending values.
Definition log_level.h:27
@ trace
Finest-grained informational events.
@ warn
Potentially harmful situations.
@ off
Special level to disable logging.
@ critical
Severe error events that lead to termination.
@ debug
Fine-grained informational events for debugging.
@ info
Informational messages highlighting progress.
@ error
Error events that might still allow continuation.
common::interfaces::IMonitor IMonitor
STL namespace.
Service container for dependency injection within the thread system.
Internal logging interface for the thread system.