iox::concurrent::LockFreeQueue🔗
implements a lock free queue (i.e. container with FIFO order) of elements of type T with a fixed Capacity More...
#include <lockfree_queue.hpp>
Public Types🔗
Name | |
---|---|
using ElementType | element_t |
Protected Types🔗
Name | |
---|---|
using IndexQueue< Capacity > | Queue |
using typename Queue::value_t | BufferIndex |
Public Functions🔗
Name | |
---|---|
LockFreeQueue() creates and initalizes an empty LockFreeQueue |
|
~LockFreeQueue() =default | |
LockFreeQueue(const LockFreeQueue & ) | |
LockFreeQueue(LockFreeQueue && ) | |
LockFreeQueue & | operator=(const LockFreeQueue & ) |
LockFreeQueue & | operator=(LockFreeQueue && ) |
constexpr uint64_t | capacity() const returns the capacity of the queue |
bool | tryPush(ElementType && value) tries to insert value in FIFO order, moves the value internally |
bool | tryPush(const ElementType & value) tries to insert value in FIFO order, copies the value internally |
iox::cxx::optional< ElementType > | push(const ElementType & value) inserts value in FIFO order, always succeeds by removing the oldest value when the queue is detected to be full (overflow) |
iox::cxx::optional< ElementType > | push(ElementType && value) inserts value in FIFO order, always succeeds by removing the oldest value when the queue is detected to be full (overflow) |
iox::cxx::optional< ElementType > | pop() tries to remove value in FIFO order |
bool | empty() const check whether the queue is empty |
uint64_t | size() const get the number of stored elements in the queue |
Protected Functions🔗
Name | |
---|---|
template \<typename T > void |
writeBufferAt(const BufferIndex & index, T && value) |
template \<typename T > iox::cxx::optional< ElementType > |
pushImpl(T && value) |
cxx::optional< ElementType > | readBufferAt(const BufferIndex & index) |
Protected Attributes🔗
Name | |
---|---|
Queue | m_freeIndices |
Queue | m_usedIndices |
Buffer< ElementType, Capacity, BufferIndex > | m_buffer |
std::atomic< uint64_t > | m_size |
Detailed Description🔗
template <typename ElementType ,
uint64_t Capacity>
class iox::concurrent::LockFreeQueue;
implements a lock free queue (i.e. container with FIFO order) of elements of type T with a fixed Capacity
Public Types Documentation🔗
using element_t🔗
using iox::concurrent::LockFreeQueue< ElementType, Capacity >::element_t = ElementType;
Protected Types Documentation🔗
using Queue🔗
using iox::concurrent::LockFreeQueue< ElementType, Capacity >::Queue = IndexQueue<Capacity>;
using BufferIndex🔗
using iox::concurrent::LockFreeQueue< ElementType, Capacity >::BufferIndex = typename Queue::value_t;
Public Functions Documentation🔗
function LockFreeQueue🔗
LockFreeQueue()
creates and initalizes an empty LockFreeQueue
function ~LockFreeQueue🔗
~LockFreeQueue() =default
function LockFreeQueue🔗
LockFreeQueue(
const LockFreeQueue &
)
function LockFreeQueue🔗
LockFreeQueue(
LockFreeQueue &&
)
function operator=🔗
LockFreeQueue & operator=(
const LockFreeQueue &
)
function operator=🔗
LockFreeQueue & operator=(
LockFreeQueue &&
)
function capacity🔗
constexpr uint64_t capacity() const
returns the capacity of the queue
Note: threadsafe, lockfree
function tryPush🔗
bool tryPush(
ElementType && value
)
tries to insert value in FIFO order, moves the value internally
Parameters:
- value to be inserted
Return: true if insertion was successful (i.e. queue was not full during push), false otherwise
Note: threadsafe, lockfree
function tryPush🔗
bool tryPush(
const ElementType & value
)
tries to insert value in FIFO order, copies the value internally
Parameters:
- value to be inserted
Return: true if insertion was successful (i.e. queue was not full during push), false otherwise
Note: threadsafe, lockfree
function push🔗
iox::cxx::optional< ElementType > push(
const ElementType & value
)
inserts value in FIFO order, always succeeds by removing the oldest value when the queue is detected to be full (overflow)
Parameters:
- value to be inserted is copied into the queue
Return: removed value if an overflow occured, empty optional otherwise
Note: threadsafe, lockfree
function push🔗
iox::cxx::optional< ElementType > push(
ElementType && value
)
inserts value in FIFO order, always succeeds by removing the oldest value when the queue is detected to be full (overflow)
Parameters:
- value to be inserted is moved into the queue if possible
Return: removed value if an overflow occured, empty optional otherwise
Note: threadsafe, lockfree
function pop🔗
iox::cxx::optional< ElementType > pop()
tries to remove value in FIFO order
Return: value if removal was successful, empty optional otherwise
Note: threadsafe, lockfree
function empty🔗
bool empty() const
check whether the queue is empty
Return: true iff the queue is empty
Note:
- that if the queue is used concurrently it might not be empty anymore after the call (but it was at some point during the call)
- threadsafe, lockfree
function size🔗
uint64_t size() const
get the number of stored elements in the queue
Return: number of stored elements in the queue
Note:
- that this will not be perfectly in sync with the actual number of contained elements during concurrent operation but will always be at most capacity
- threadsafe, lockfree
Protected Functions Documentation🔗
function writeBufferAt🔗
template <typename T >
void writeBufferAt(
const BufferIndex & index,
T && value
)
function pushImpl🔗
template <typename T >
iox::cxx::optional< ElementType > pushImpl(
T && value
)
function readBufferAt🔗
cxx::optional< ElementType > readBufferAt(
const BufferIndex & index
)
Protected Attributes Documentation🔗
variable m_freeIndices🔗
Queue m_freeIndices;
variable m_usedIndices🔗
Queue m_usedIndices;
variable m_buffer🔗
Buffer< ElementType, Capacity, BufferIndex > m_buffer;
variable m_size🔗
std::atomic< uint64_t > m_size {0u};
Updated on 31 May 2022 at 15:29:15 CEST