Thread System 0.3.1
High-performance C++20 thread pool with work stealing and DAG scheduling
Loading...
Searching...
No Matches
kcenon::thread::adaptive_job_queue Class Reference

Adaptive queue that switches between mutex and lock-free modes. More...

#include <adaptive_job_queue.h>

Inheritance diagram for kcenon::thread::adaptive_job_queue:
Inheritance graph
Collaboration diagram for kcenon::thread::adaptive_job_queue:
Collaboration graph

Classes

class  accuracy_guard
 RAII guard that temporarily switches to accuracy mode. More...
 
struct  stats
 Statistics about mode switching. More...
 

Public Types

enum class  mode { mutex , lock_free }
 Operating mode. More...
 
enum class  policy { accuracy_first , performance_first , balanced , manual }
 Selection policy. More...
 

Public Member Functions

 adaptive_job_queue (policy p=policy::balanced)
 Create adaptive queue with specified policy.
 
 ~adaptive_job_queue ()
 Destructor - cleans up both queue implementations.
 
 adaptive_job_queue (const adaptive_job_queue &)=delete
 
adaptive_job_queueoperator= (const adaptive_job_queue &)=delete
 
 adaptive_job_queue (adaptive_job_queue &&)=delete
 
adaptive_job_queueoperator= (adaptive_job_queue &&)=delete
 
auto schedule (std::unique_ptr< job > &&work) -> common::VoidResult override
 Schedule a job (delegates to current queue)
 
auto get_next_job () -> common::Result< std::unique_ptr< job > > override
 Get next job (delegates to current queue)
 
auto enqueue (std::unique_ptr< job > &&j) -> common::VoidResult
 Enqueues a job into the current active queue.
 
template<typename JobType , typename = std::enable_if_t<std::is_base_of_v<job, JobType>>>
auto enqueue (std::unique_ptr< JobType > &&value) -> common::VoidResult
 Type-safe enqueue for job subclasses.
 
auto dequeue () -> common::Result< std::unique_ptr< job > >
 Dequeues a job from the current active queue.
 
auto try_dequeue () -> common::Result< std::unique_ptr< job > >
 Tries to dequeue a job without blocking.
 
auto empty () const -> bool
 Checks if the queue is empty.
 
auto size () const -> std::size_t
 Returns the current number of jobs in the queue.
 
auto clear () -> void
 Clears all jobs from the queue.
 
auto stop () -> void
 Signals the queue to stop.
 
auto is_stopped () const -> bool
 Checks if the queue is stopped.
 
auto get_capabilities () const -> queue_capabilities override
 Returns capabilities based on current mode.
 
auto current_mode () const -> mode
 Get current operating mode.
 
auto current_policy () const -> policy
 Get current policy.
 
auto switch_mode (mode m) -> common::VoidResult
 Manually switch mode (only if policy is manual)
 
auto get_stats () const -> stats
 Get statistics about queue usage.
 
auto require_accuracy () -> accuracy_guard
 Request temporary accuracy mode.
 
- Public Member Functions inherited from kcenon::thread::scheduler_interface
virtual ~scheduler_interface ()=default
 
- Public Member Functions inherited from kcenon::thread::queue_capabilities_interface
virtual ~queue_capabilities_interface ()=default
 
auto has_exact_size () const -> bool
 Check if size() returns exact values.
 
auto has_atomic_empty () const -> bool
 Check if empty() check is atomic.
 
auto is_lock_free () const -> bool
 Check if this is a lock-free implementation.
 
auto is_wait_free () const -> bool
 Check if this is a wait-free implementation.
 
auto supports_batch () const -> bool
 Check if batch operations are supported.
 
auto supports_blocking_wait () const -> bool
 Check if blocking wait is supported.
 
auto supports_stop () const -> bool
 Check if stop signaling is supported.
 

Private Member Functions

void migrate_to_mode (mode target)
 
void update_mode_time ()
 
auto determine_mode_for_balanced () const -> mode
 

Private Attributes

policy policy_
 
std::atomic< modecurrent_mode_
 
std::atomic< bool > stopped_ {false}
 
std::shared_ptr< job_queuemutex_queue_
 
std::unique_ptr< detail::lockfree_job_queuelockfree_queue_
 
std::mutex migration_mutex_
 
std::atomic< int > accuracy_guard_count_ {0}
 
std::mutex stats_mutex_
 
stats stats_
 
std::chrono::steady_clock::time_point mode_start_time_
 

Detailed Description

Adaptive queue that switches between mutex and lock-free modes.

This class WRAPS existing job_queue and lockfree_job_queue, providing automatic or manual mode switching based on requirements.

Note
This is a NEW class. Existing job_queue and lockfree_job_queue are UNCHANGED and can still be used directly.

Key Features

  • Wraps both mutex-based and lock-free queue implementations
  • Supports multiple selection policies (accuracy, performance, balanced, manual)
  • Provides RAII guard for temporary accuracy mode
  • Thread-safe mode switching with data migration
  • Statistics tracking for mode switches and time spent in each mode

Usage

// Create adaptive queue (defaults to balanced policy)
auto queue = std::make_unique<adaptive_job_queue>();
// Use like any other queue
queue->enqueue(std::make_unique<my_job>());
auto job = queue->dequeue();
// Temporarily require accuracy
{
auto guard = queue->require_accuracy();
size_t exact = queue->size(); // Now guaranteed exact
}
Represents a unit of work (task) to be executed, typically by a job queue.
Definition job.h:136
Examples
adaptive_queue_sample.cpp.

Definition at line 60 of file adaptive_job_queue.h.

Member Enumeration Documentation

◆ mode

Operating mode.

Enumerator
mutex 

Using job_queue (accuracy mode)

lock_free 

Using lockfree_job_queue (performance mode)

Definition at line 66 of file adaptive_job_queue.h.

66 {
67 mutex,
69 };
@ mutex
Using job_queue (accuracy mode)
@ lock_free
Using lockfree_job_queue (performance mode)

◆ policy

Selection policy.

Enumerator
accuracy_first 

Always use mutex mode.

performance_first 

Always use lock-free mode.

balanced 

Auto-switch based on usage.

manual 

User controls mode.

Definition at line 74 of file adaptive_job_queue.h.

74 {
77 balanced,
78 manual
79 };
@ performance_first
Always use lock-free mode.
@ balanced
Auto-switch based on usage.

Constructor & Destructor Documentation

◆ adaptive_job_queue() [1/3]

kcenon::thread::adaptive_job_queue::adaptive_job_queue ( policy p = policy::balanced)
explicit

Create adaptive queue with specified policy.

Parameters
pSelection policy (default: balanced)

Definition at line 13 of file adaptive_job_queue.cpp.

14 : policy_(p)
16 , mutex_queue_(std::make_shared<job_queue>())
17 , lockfree_queue_(std::make_unique<detail::lockfree_job_queue>())
18 , mode_start_time_(std::chrono::steady_clock::now()) {
19
20 // Set initial mode based on policy
21 switch (policy_) {
23 current_mode_.store(mode::mutex, std::memory_order_release);
24 break;
26 current_mode_.store(mode::lock_free, std::memory_order_release);
27 break;
29 case policy::manual:
30 // Default to mutex mode for balanced and manual
31 current_mode_.store(mode::mutex, std::memory_order_release);
32 break;
33 }
34}
std::shared_ptr< job_queue > mutex_queue_
std::chrono::steady_clock::time_point mode_start_time_
std::unique_ptr< detail::lockfree_job_queue > lockfree_queue_

References accuracy_first, balanced, current_mode_, lock_free, manual, mutex, performance_first, and policy_.

◆ ~adaptive_job_queue()

kcenon::thread::adaptive_job_queue::~adaptive_job_queue ( )

Destructor - cleans up both queue implementations.

Definition at line 36 of file adaptive_job_queue.cpp.

36 {
37 // Stop and clear both queues
38 stop();
39
40 // Update final mode time
42}
auto stop() -> void
Signals the queue to stop.

References stop(), and update_mode_time().

Here is the call graph for this function:

◆ adaptive_job_queue() [2/3]

kcenon::thread::adaptive_job_queue::adaptive_job_queue ( const adaptive_job_queue & )
delete

◆ adaptive_job_queue() [3/3]

kcenon::thread::adaptive_job_queue::adaptive_job_queue ( adaptive_job_queue && )
delete

Member Function Documentation

◆ clear()

auto kcenon::thread::adaptive_job_queue::clear ( ) -> void

Clears all jobs from the queue.

Definition at line 160 of file adaptive_job_queue.cpp.

160 {
161 std::lock_guard<std::mutex> lock(migration_mutex_);
162
163 mutex_queue_->clear();
164 // lockfree_queue doesn't have clear(), drain it
165 while (true) {
166 auto result = lockfree_queue_->dequeue();
167 if (result.is_err()) {
168 break;
169 }
170 // Jobs are destroyed when unique_ptr goes out of scope
171 }
172}

◆ current_mode()

auto kcenon::thread::adaptive_job_queue::current_mode ( ) const -> mode
nodiscard

Get current operating mode.

Returns
Current mode (mutex or lock_free)

Definition at line 217 of file adaptive_job_queue.cpp.

217 {
218 return current_mode_.load(std::memory_order_acquire);
219}

References current_mode_.

Referenced by adaptive_behavior_example(), different_policies_example(), and performance_monitoring_example().

Here is the caller graph for this function:

◆ current_policy()

auto kcenon::thread::adaptive_job_queue::current_policy ( ) const -> policy
nodiscard

Get current policy.

Returns
Current selection policy

Definition at line 221 of file adaptive_job_queue.cpp.

221 {
222 return policy_;
223}

References policy_.

◆ dequeue()

auto kcenon::thread::adaptive_job_queue::dequeue ( ) -> common::Result<std::unique_ptr<job>>
nodiscard

Dequeues a job from the current active queue.

Returns
common::Result<std::unique_ptr<job>> The dequeued job or error

Definition at line 82 of file adaptive_job_queue.cpp.

82 {
83 if (stopped_.load(std::memory_order_acquire)) {
84 return common::error_info{static_cast<int>(error_code::queue_stopped), "Queue is stopped", "thread_system"};
85 }
86
87 common::Result<std::unique_ptr<job>> result = common::error_info{static_cast<int>(error_code::queue_empty), "Queue is empty", "thread_system"};
88 mode current = current_mode_.load(std::memory_order_acquire);
89
90 // Try current mode first
91 if (current == mode::mutex) {
92 result = mutex_queue_->try_dequeue();
93 // If current mode is empty, also check other queue for race condition handling
94 if (result.is_err()) {
95 result = lockfree_queue_->dequeue();
96 }
97 } else {
98 result = lockfree_queue_->dequeue();
99 // If current mode is empty, also check other queue for race condition handling
100 if (result.is_err()) {
101 result = mutex_queue_->try_dequeue();
102 }
103 }
104
105 if (result.is_ok()) {
106 std::lock_guard<std::mutex> lock(stats_mutex_);
108 }
109
110 return result;
111}
uint64_t dequeue_count
Total dequeue operations.

References kcenon::thread::result< T >::is_ok(), kcenon::thread::queue_empty, and kcenon::thread::queue_stopped.

Referenced by adaptive_behavior_example(), different_policies_example(), performance_monitoring_example(), policy_comparison_example(), and web_server_simulation().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ determine_mode_for_balanced()

auto kcenon::thread::adaptive_job_queue::determine_mode_for_balanced ( ) const -> mode
private

Definition at line 392 of file adaptive_job_queue.cpp.

392 {
393 // For balanced policy, use heuristics based on recent activity
394 // Current simple heuristic: prefer lock-free for high throughput
395
396 std::lock_guard<std::mutex> lock(stats_mutex_);
397
398 // If we've processed a lot of jobs, prefer lock-free for performance
399 uint64_t total_ops = stats_.enqueue_count + stats_.dequeue_count;
400 if (total_ops > 10000) {
401 return mode::lock_free;
402 }
403
404 // For lower throughput, prefer mutex for accuracy
405 return mode::mutex;
406}
uint64_t enqueue_count
Total enqueue operations.

References kcenon::thread::adaptive_job_queue::stats::dequeue_count, kcenon::thread::adaptive_job_queue::stats::enqueue_count, lock_free, mutex, stats_, and stats_mutex_.

◆ empty()

auto kcenon::thread::adaptive_job_queue::empty ( ) const -> bool
nodiscard

Checks if the queue is empty.

Returns
true if queue is empty, false otherwise
Note
Accuracy depends on current mode

Definition at line 144 of file adaptive_job_queue.cpp.

144 {
145 // Check both queues to handle race conditions during mode transitions
146 // During migration, items may temporarily exist in either queue
147 return mutex_queue_->empty() && lockfree_queue_->empty();
148}

References lockfree_queue_, and mutex_queue_.

Referenced by different_policies_example().

Here is the caller graph for this function:

◆ enqueue() [1/2]

auto kcenon::thread::adaptive_job_queue::enqueue ( std::unique_ptr< job > && j) -> common::VoidResult
nodiscard

Enqueues a job into the current active queue.

Parameters
jUnique pointer to the job being added
Returns
common::VoidResult indicating success or error

Definition at line 60 of file adaptive_job_queue.cpp.

60 {
61 if (stopped_.load(std::memory_order_acquire)) {
62 return common::error_info{static_cast<int>(error_code::queue_stopped), "Queue is stopped", "thread_system"};
63 }
64
65 if (!j) {
66 return common::error_info{static_cast<int>(error_code::invalid_argument), "Cannot enqueue null job", "thread_system"};
67 }
68
69 mode current = current_mode_.load(std::memory_order_acquire);
70 common::VoidResult result = (current == mode::mutex)
71 ? mutex_queue_->enqueue(std::move(j))
72 : lockfree_queue_->enqueue(std::move(j));
73
74 if (result.is_ok()) {
75 std::lock_guard<std::mutex> lock(stats_mutex_);
77 }
78
79 return result;
80}

References kcenon::thread::invalid_argument, kcenon::thread::result< T >::is_ok(), and kcenon::thread::queue_stopped.

Referenced by adaptive_behavior_example(), different_policies_example(), enqueue(), performance_monitoring_example(), policy_comparison_example(), and web_server_simulation().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ enqueue() [2/2]

template<typename JobType , typename = std::enable_if_t<std::is_base_of_v<job, JobType>>>
auto kcenon::thread::adaptive_job_queue::enqueue ( std::unique_ptr< JobType > && value) -> common::VoidResult
inlinenodiscard

Type-safe enqueue for job subclasses.

This template method provides type-safe job submission, allowing callers to enqueue jobs without explicit casting. The JobType must be derived from the base job class.

Template Parameters
JobTypeA type derived from job
Parameters
valueA unique pointer to the job being added.
Returns
common::VoidResult indicating success or error
auto queue = std::make_unique<adaptive_job_queue>();
queue->enqueue<my_custom_job>(std::make_unique<my_custom_job>());

Definition at line 149 of file adaptive_job_queue.h.

150 {
151 return enqueue(std::unique_ptr<job>(std::move(value)));
152 }
auto enqueue(std::unique_ptr< job > &&j) -> common::VoidResult
Enqueues a job into the current active queue.

References enqueue().

Here is the call graph for this function:

◆ get_capabilities()

auto kcenon::thread::adaptive_job_queue::get_capabilities ( ) const -> queue_capabilities
nodiscardoverridevirtual

Returns capabilities based on current mode.

Returns
Queue capabilities struct
Note
Capabilities change based on current operating mode:
  • Mutex mode: exact_size=true, atomic_empty_check=true, lock_free=false
  • Lock-free mode: exact_size=false, atomic_empty_check=false, lock_free=true

Reimplemented from kcenon::thread::queue_capabilities_interface.

Definition at line 187 of file adaptive_job_queue.cpp.

187 {
188 mode current = current_mode_.load(std::memory_order_acquire);
189
190 if (current == mode::mutex) {
191 return queue_capabilities{
192 .exact_size = true,
193 .atomic_empty_check = true,
194 .lock_free = false,
195 .wait_free = false,
196 .supports_batch = true,
197 .supports_blocking_wait = true,
198 .supports_stop = true
199 };
200 } else {
201 return queue_capabilities{
202 .exact_size = false,
203 .atomic_empty_check = false,
204 .lock_free = true,
205 .wait_free = false,
206 .supports_batch = false,
207 .supports_blocking_wait = false,
208 .supports_stop = true
209 };
210 }
211}

References current_mode_, and mutex.

◆ get_next_job()

auto kcenon::thread::adaptive_job_queue::get_next_job ( ) -> common::Result<std::unique_ptr<job>>
overridevirtual

Get next job (delegates to current queue)

Returns
common::Result<std::unique_ptr<job>> The dequeued job or error

Implements kcenon::thread::scheduler_interface.

Definition at line 52 of file adaptive_job_queue.cpp.

52 {
53 return dequeue();
54}
auto dequeue() -> common::Result< std::unique_ptr< job > >
Dequeues a job from the current active queue.

◆ get_stats()

auto kcenon::thread::adaptive_job_queue::get_stats ( ) const -> stats
nodiscard

Get statistics about queue usage.

Returns
Current statistics

Definition at line 239 of file adaptive_job_queue.cpp.

239 {
240 std::lock_guard<std::mutex> lock(stats_mutex_);
241
242 // Create a copy of stats with updated time
243 stats result = stats_;
244
245 // Add current mode time
246 auto now = std::chrono::steady_clock::now();
247 auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(
248 now - mode_start_time_).count();
249
250 if (current_mode_.load(std::memory_order_acquire) == mode::mutex) {
251 result.time_in_mutex_ms += duration;
252 } else {
253 result.time_in_lockfree_ms += duration;
254 }
255
256 return result;
257}

References current_mode_, mode_start_time_, mutex, stats_, and stats_mutex_.

Referenced by performance_monitoring_example(), and web_server_simulation().

Here is the caller graph for this function:

◆ is_stopped()

auto kcenon::thread::adaptive_job_queue::is_stopped ( ) const -> bool
nodiscard

Checks if the queue is stopped.

Returns
true if stopped, false otherwise

Definition at line 179 of file adaptive_job_queue.cpp.

179 {
180 return stopped_.load(std::memory_order_acquire);
181}

References stopped_.

◆ migrate_to_mode()

void kcenon::thread::adaptive_job_queue::migrate_to_mode ( mode target)
private

Definition at line 330 of file adaptive_job_queue.cpp.

330 {
331 std::lock_guard<std::mutex> lock(migration_mutex_);
332
333 mode current = current_mode_.load(std::memory_order_acquire);
334 if (current == target) {
335 return; // Already in target mode
336 }
337
338 // Update time tracking before mode change
340
341 // IMPORTANT: Update mode FIRST, then drain the old queue.
342 // This ensures new enqueues go to the target queue while we drain,
343 // preventing an infinite drain loop where the producer keeps adding
344 // to the source queue faster than we can drain it.
345 current_mode_.store(target, std::memory_order_release);
346
347 if (target == mode::mutex) {
348 // Migrate from lock-free to mutex
349 // Drain remaining jobs from lockfree queue and move to mutex queue
350 while (true) {
351 auto result = lockfree_queue_->dequeue();
352 if (result.is_err()) {
353 break;
354 }
355 (void)mutex_queue_->enqueue(std::move(result.value()));
356 }
357 } else {
358 // Migrate from mutex to lock-free
359 // Drain mutex queue and move jobs to lockfree queue
360 auto jobs = mutex_queue_->dequeue_batch();
361 for (auto& job : jobs) {
362 (void)lockfree_queue_->enqueue(std::move(job));
363 }
364 }
365
366 // Update statistics
367 {
368 std::lock_guard<std::mutex> stats_lock(stats_mutex_);
370 }
371
372 // Reset mode start time
373 mode_start_time_ = std::chrono::steady_clock::now();
374}
uint64_t mode_switches
Total number of mode switches.

References current_mode_, lockfree_queue_, migration_mutex_, mode_start_time_, kcenon::thread::adaptive_job_queue::stats::mode_switches, mutex, mutex_queue_, stats_, stats_mutex_, update_mode_time(), and kcenon::thread::result< T >::value().

Referenced by kcenon::thread::adaptive_job_queue::accuracy_guard::accuracy_guard().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ operator=() [1/2]

adaptive_job_queue & kcenon::thread::adaptive_job_queue::operator= ( adaptive_job_queue && )
delete

◆ operator=() [2/2]

adaptive_job_queue & kcenon::thread::adaptive_job_queue::operator= ( const adaptive_job_queue & )
delete

◆ require_accuracy()

auto kcenon::thread::adaptive_job_queue::require_accuracy ( ) -> accuracy_guard
nodiscard

Request temporary accuracy mode.

Returns
Guard object - mode reverts when guard is destroyed
Note
While the guard is active:
  • Queue operates in mutex mode
  • size() returns exact count
  • empty() is atomically consistent
auto queue = std::make_unique<adaptive_job_queue>();
{
auto guard = queue->require_accuracy();
// In this scope, size() is guaranteed exact
if (queue->size() > 1000) {
apply_backpressure();
}
}
// After scope, may revert to lock-free mode

Definition at line 259 of file adaptive_job_queue.cpp.

259 {
260 return accuracy_guard(*this);
261}

◆ schedule()

auto kcenon::thread::adaptive_job_queue::schedule ( std::unique_ptr< job > && work) -> common::VoidResult
overridevirtual

Schedule a job (delegates to current queue)

Parameters
workJob to schedule
Returns
common::VoidResult Success or error

Implements kcenon::thread::scheduler_interface.

Definition at line 48 of file adaptive_job_queue.cpp.

48 {
49 return enqueue(std::move(work));
50}

◆ size()

auto kcenon::thread::adaptive_job_queue::size ( ) const -> std::size_t
nodiscard

Returns the current number of jobs in the queue.

Returns
Number of pending jobs
Note
Exact in mutex mode, approximate in lock-free mode

Definition at line 150 of file adaptive_job_queue.cpp.

150 {
151 mode current = current_mode_.load(std::memory_order_acquire);
152
153 if (current == mode::mutex) {
154 return mutex_queue_->size();
155 } else {
156 return lockfree_queue_->size();
157 }
158}

References current_mode_, lockfree_queue_, mutex, and mutex_queue_.

◆ stop()

auto kcenon::thread::adaptive_job_queue::stop ( ) -> void

Signals the queue to stop.

Definition at line 174 of file adaptive_job_queue.cpp.

174 {
175 stopped_.store(true, std::memory_order_release);
176 mutex_queue_->stop();
177}

Referenced by ~adaptive_job_queue().

Here is the caller graph for this function:

◆ switch_mode()

auto kcenon::thread::adaptive_job_queue::switch_mode ( mode m) -> common::VoidResult

Manually switch mode (only if policy is manual)

Parameters
mTarget mode to switch to
Returns
common::VoidResult Success or error if policy is not manual

Definition at line 225 of file adaptive_job_queue.cpp.

225 {
226 if (policy_ != policy::manual) {
227 return common::error_info{static_cast<int>(error_code::invalid_argument),
228 "Mode switching is only allowed with manual policy", "thread_system"};
229 }
230
231 if (current_mode_.load(std::memory_order_acquire) == m) {
232 return common::ok(); // Already in target mode
233 }
234
236 return common::ok();
237}

References kcenon::thread::invalid_argument.

◆ try_dequeue()

auto kcenon::thread::adaptive_job_queue::try_dequeue ( ) -> common::Result<std::unique_ptr<job>>
nodiscard

Tries to dequeue a job without blocking.

Returns
common::Result<std::unique_ptr<job>> The dequeued job or error

Definition at line 113 of file adaptive_job_queue.cpp.

113 {
114 if (stopped_.load(std::memory_order_acquire)) {
115 return common::error_info{static_cast<int>(error_code::queue_stopped), "Queue is stopped", "thread_system"};
116 }
117
118 common::Result<std::unique_ptr<job>> result = common::error_info{static_cast<int>(error_code::queue_empty), "Queue is empty", "thread_system"};
119 mode current = current_mode_.load(std::memory_order_acquire);
120
121 // Try current mode first
122 if (current == mode::mutex) {
123 result = mutex_queue_->try_dequeue();
124 // If current mode is empty, also check other queue for race condition handling
125 if (result.is_err()) {
126 result = lockfree_queue_->try_dequeue();
127 }
128 } else {
129 result = lockfree_queue_->try_dequeue();
130 // If current mode is empty, also check other queue for race condition handling
131 if (result.is_err()) {
132 result = mutex_queue_->try_dequeue();
133 }
134 }
135
136 if (result.is_ok()) {
137 std::lock_guard<std::mutex> lock(stats_mutex_);
139 }
140
141 return result;
142}

References kcenon::thread::result< T >::is_ok(), kcenon::thread::queue_empty, and kcenon::thread::queue_stopped.

Here is the call graph for this function:

◆ update_mode_time()

void kcenon::thread::adaptive_job_queue::update_mode_time ( )
private

Definition at line 376 of file adaptive_job_queue.cpp.

376 {
377 std::lock_guard<std::mutex> lock(stats_mutex_);
378
379 auto now = std::chrono::steady_clock::now();
380 auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(
381 now - mode_start_time_).count();
382
383 if (current_mode_.load(std::memory_order_acquire) == mode::mutex) {
384 stats_.time_in_mutex_ms += duration;
385 } else {
386 stats_.time_in_lockfree_ms += duration;
387 }
388
389 mode_start_time_ = now;
390}
uint64_t time_in_lockfree_ms
Cumulative time in lock-free mode (ms)
uint64_t time_in_mutex_ms
Cumulative time in mutex mode (ms)

References current_mode_, mode_start_time_, mutex, stats_, stats_mutex_, kcenon::thread::adaptive_job_queue::stats::time_in_lockfree_ms, and kcenon::thread::adaptive_job_queue::stats::time_in_mutex_ms.

Referenced by migrate_to_mode(), and ~adaptive_job_queue().

Here is the caller graph for this function:

Member Data Documentation

◆ accuracy_guard_count_

std::atomic<int> kcenon::thread::adaptive_job_queue::accuracy_guard_count_ {0}
private

◆ current_mode_

std::atomic<mode> kcenon::thread::adaptive_job_queue::current_mode_
private

◆ lockfree_queue_

std::unique_ptr<detail::lockfree_job_queue> kcenon::thread::adaptive_job_queue::lockfree_queue_
private

Definition at line 318 of file adaptive_job_queue.h.

Referenced by empty(), migrate_to_mode(), and size().

◆ migration_mutex_

std::mutex kcenon::thread::adaptive_job_queue::migration_mutex_
mutableprivate

Definition at line 321 of file adaptive_job_queue.h.

Referenced by migrate_to_mode().

◆ mode_start_time_

std::chrono::steady_clock::time_point kcenon::thread::adaptive_job_queue::mode_start_time_
private

Definition at line 329 of file adaptive_job_queue.h.

Referenced by get_stats(), migrate_to_mode(), and update_mode_time().

◆ mutex_queue_

std::shared_ptr<job_queue> kcenon::thread::adaptive_job_queue::mutex_queue_
private

Definition at line 317 of file adaptive_job_queue.h.

Referenced by empty(), migrate_to_mode(), and size().

◆ policy_

policy kcenon::thread::adaptive_job_queue::policy_
private

Definition at line 312 of file adaptive_job_queue.h.

Referenced by adaptive_job_queue(), and current_policy().

◆ stats_

stats kcenon::thread::adaptive_job_queue::stats_
private

◆ stats_mutex_

std::mutex kcenon::thread::adaptive_job_queue::stats_mutex_
mutableprivate

◆ stopped_

std::atomic<bool> kcenon::thread::adaptive_job_queue::stopped_ {false}
private

Definition at line 314 of file adaptive_job_queue.h.

314{false};

Referenced by is_stopped().


The documentation for this class was generated from the following files: