|
|
A simple triple buffer for lockfree comunication between a single writer and a single reader. More...
#include <ArmarXCore/util/CPPUtility/TripleBuffer.h>
Public Member Functions | |
| T & | _getNonConstHiddenBuffer () |
| T & | _getNonConstReadBuffer () |
| void | commitWrite () |
| const T & | getReadBuffer () const |
| const T & | getUpToDateReadBuffer () const |
| T & | getWriteBuffer () |
| const T & | getWriteBuffer () const |
| template<class U = T> | |
| std::enable_if< std::is_copy_constructible< U >::value >::type | reinitAllBuffers (const T &init) |
| void | reinitAllBuffers (T &&writeBuff, T &&hiddenBuff, T &&readBuff) |
| void | setDebugMode (bool mode) |
| template<class... Ts> | |
| TripleBuffer (const Ts &... ts) | |
| TripleBuffer (T &&initR, T &&initH, T &&initW) | |
| bool | updateReadBuffer () const |
| Swaps in the hidden buffer if it contains new data. | |
Protected Member Functions | |
| uint_fast8_t | getHiddenBufferIndex () const |
| uint_fast8_t | getReadBufferIndex () const |
| uint_fast8_t | getWriteBufferIndex () const |
| bool | hasNewWrite (uint_fast8_t flags) const |
| TripleBuffer & | operator= (const TripleBuffer &)=delete |
| void | swapWriteAndHiddenBuffer () |
| Swap the write buffer with the hidden buffer. | |
| TripleBuffer (const TripleBuffer &)=delete | |
Static Protected Member Functions | |
| static uint_fast8_t | flagSwapReadWithHidden (uint_fast8_t flags) |
| swap read and hidden indexes | |
| static uint_fast8_t | flagSwapWriteWithHidden (uint_fast8_t flags) |
| swap write and hidden indexes of given flags (set dirty to 1) | |
Protected Attributes | |
| T | buffer [3] |
| std::atomic_bool | debugMode {false} |
| std::atomic_uint_fast8_t | flags {initialFlags} |
Static Protected Attributes | |
| static const uint_fast8_t | dirtyBitMask = 1 << dirtyBitShift |
| static const uint_fast8_t | dirtyBitShift = 7 |
| static const uint_fast8_t | hiddenBufferIndexMask = 3 << hiddenBufferIndexShift |
| static const uint_fast8_t | hiddenBufferIndexShift = 2 |
| static const uint_fast8_t | hiddenToReadShift = hiddenBufferIndexShift - readBufferIndexShift |
| static const uint_fast8_t | hiddenToWriteShift |
| static const uint_fast8_t | initialFlags = 2 + (1 << 2) |
| static const uint_fast8_t | readBufferIndexMask = 3 << readBufferIndexShift |
| static const uint_fast8_t | readBufferIndexShift = 0 |
| static const uint_fast8_t | writeBufferIndexMask = 3 << writeBufferIndexShift |
| static const uint_fast8_t | writeBufferIndexShift = 4 |
A simple triple buffer for lockfree comunication between a single writer and a single reader.
If more than one reader/writer is required, you have to synchronize the access. Writers must not have: writes to the same data cell (except it is an atomic et al) and no writes are allowed during swapping of the buffer. Readers must not read when the buffer is swapped. If a writer only writes parts of the data structure, data loss could occure! (use a WriteBufferedTripleBuffer instead)
|
inline |
|
protecteddelete |
|
inline |
|
inlinestaticprotected |
swap read and hidden indexes
swap read and hidden indexes of given flags (set dirty to 0)
| flags | the current flags |
|
inlinestaticprotected |
swap write and hidden indexes of given flags (set dirty to 1)
| flags | the current flags |
|
inlineprotected |
|
inlineprotected |
|
inlineprotected |
|
inlineprotected |
|
protecteddelete |
|
inline |
|
inline |
|
inline |
|
inlineprotected |
Swap the write buffer with the hidden buffer.
|
inline |
Swaps in the hidden buffer if it contains new data.
|
protected |
|
staticprotected |
|
staticprotected |
|
mutableprotected |
|
staticprotected |
|
staticprotected |
|
staticprotected |
|
staticprotected |
|
staticprotected |
|
staticprotected |
|
staticprotected |
|
staticprotected |
|
staticprotected |