#include <work_queue.h>
Public Member Functions | |
WorkQueue (InlineQueue< WorkItem > &queue, size_t queue_capacity) | |
Status | PushWork (WorkItem &&work_item) |
void | CheckPushWork (WorkItem &&work_item) |
void | RequestStop () |
Enables threads and interrupts to enqueue work as a pw::work_queue::WorkItem
for execution by the work queue.
Queue sizing: The number of outstanding work requests is limited based on the internal queue size. The queue size is set through either the size of the queue_storage
buffer passed into the constructor or by using the templated pw::work_queue::WorkQueueWithBuffer
helper. When the queue is full, the queue will not accept further work.
Cooperative thread cancellation: The class is a pw::thread::ThreadCore
, meaning it should be executed as a single thread. To facilitate clean shutdown, it provides a RequestStop()
method for cooperative cancellation which should be invoked before joining the thread. Once a stop has been requested the queue will no longer accept further work.
The entire API is thread-safe and interrupt-safe.
|
inline |
[in] | queue | The work entries to enqueue. |
[in] | queue_capacity | The internal queue size which limits the number of outstanding work requests. |
ThreadNotification
prevents this from being constexpr
. void pw::work_queue::WorkQueue::CheckPushWork | ( | WorkItem && | work_item | ) |
Queues work for execution. Crashes if the work cannot be queued due to a full queue or a stopped worker thread.
This call is recommended where possible since it saves error handling code at the callsite; and in many practical cases, it is a bug if the work queue is full (and so a crash is useful to detect the problem).
[in] | work_item | The entry to enqueue. |
|
inline |
Enqueues a work_item
for execution by the work queue thread.
[in] | work_item | The entry to enqueue. |
embed:rst:leading-asterisk * * .. pw-status-codes:: * * OK: Success. Entry was enqueued for execution. * * FAILED_PRECONDITION: The work queue is shutting down. Entries are no * longer permitted. * * RESOURCE_EXHAUSTED: Internal work queue is full. Entry was not * enqueued. * *
void pw::work_queue::WorkQueue::RequestStop | ( | ) |