101 [[nodiscard]]
auto enqueue(std::unique_ptr<job>&&
job) -> common::VoidResult;
116 [[nodiscard]]
auto dequeue() -> common::Result<std::unique_ptr<job>>;
126 [[nodiscard]]
auto try_dequeue() -> common::Result<std::unique_ptr<job>> {
138 [[nodiscard]]
auto empty() const ->
bool;
148 [[nodiscard]] auto
size() const ->
std::
size_t;
163 return enqueue(std::move(work));
200 .atomic_empty_check =
false,
203 .supports_batch =
false,
204 .supports_blocking_wait =
false,
205 .supports_stop =
false
218 std::atomic<node*>
next{
nullptr};
222 explicit node(std::unique_ptr<job>&& job_data)
246 node* next = head->
next.load(std::memory_order_relaxed);
265 head, head->
next.load(std::memory_order_relaxed),
266 std::memory_order_acq_rel,
267 std::memory_order_acquire)) {
269 head->
data = std::move(job_data);
270 head->
next.store(
nullptr, std::memory_order_relaxed);
276 return new node(std::move(job_data));
289 n->
next.store(old_head, std::memory_order_relaxed);
292 std::memory_order_release,
293 std::memory_order_relaxed));
Lock-free node freelist (Treiber stack) for node recycling.
node_pool & operator=(const node_pool &)=delete
void release(node *n)
Return a retired node to the pool for reuse.
std::atomic< node * > free_list_
node_pool(const node_pool &)=delete
node * acquire(std::unique_ptr< job > &&job_data)
Acquire a node from the pool, or allocate a new one.
Lock-free Multi-Producer Multi-Consumer (MPMC) job queue (Internal implementation)
~lockfree_job_queue()
Destructor.
std::atomic< std::size_t > approximate_size_
auto try_dequeue() -> common::Result< std::unique_ptr< job > >
Tries to dequeue a job without blocking.
auto size() const -> std::size_t
Gets approximate queue size.
std::atomic< bool > shutdown_
lockfree_job_queue & operator=(const lockfree_job_queue &)=delete
lockfree_job_queue()
Constructs an empty lock-free job queue.
lockfree_job_queue & operator=(lockfree_job_queue &&)=delete
std::atomic< node * > tail_
std::atomic< node * > head_
std::shared_ptr< node_pool > pool_
auto schedule(std::unique_ptr< job > &&work) -> common::VoidResult override
Schedule a job (delegates to enqueue)
lockfree_job_queue(const lockfree_job_queue &)=delete
lockfree_job_queue(lockfree_job_queue &&)=delete
auto get_next_job() -> common::Result< std::unique_ptr< job > > override
Get next job (delegates to dequeue)
void retire_node(node *n)
Retire a node through hazard pointers, recycling via pool on reclamation.
auto enqueue(std::unique_ptr< job > &&job) -> common::VoidResult
Enqueues a job into the queue (thread-safe)
auto get_capabilities() const -> queue_capabilities override
Returns capabilities of lockfree_job_queue.
auto empty() const -> bool
Checks if the queue is empty.
auto dequeue() -> common::Result< std::unique_ptr< job > >
Dequeues a job from the queue (thread-safe)
Represents a unit of work (task) to be executed, typically by a job queue.
Mixin interface for queue capability introspection.
Scheduler interface for queuing and retrieving jobs.
Typed hazard pointer domain.
Error codes and utilities for the thread system.
Base job class for schedulable work units in the thread system.
Core threading foundation of the thread system library.
Mixin interface for queue capability introspection.
Thread-local hazard pointer with explicit memory ordering for safe reclamation.
Abstract scheduler interface for queuing and retrieving jobs.
Internal queue node structure.
node(std::unique_ptr< job > &&job_data)
std::unique_ptr< job > data
std::atomic< node * > next
Runtime-queryable queue capabilities descriptor.