Go to the documentation of this file.
6#ifndef TASKMANAGERIO_CIRCULARBUFFER_H
7#define TASKMANAGERIO_CIRCULARBUFFER_H
12using namespace tm_internal;
19namespace tccollection {
31 template<
class T>
class GenericCircularBuffer {
33 enum BufferType { CIRCULAR_BUFFER, MEMORY_POOL };
35#ifdef SC_DEBUG_CHECKER
36 volatile uint32_t casExchangeSpins = 0;
40 position_t readerPosition;
41 position_t writerPosition;
42 const uint16_t bufferSize;
44 bool actingAsMemoryPool;
47 explicit GenericCircularBuffer(uint16_t size, BufferType asMemPool = CIRCULAR_BUFFER) : readerPosition(0), writerPosition(0),
48 bufferSize(size), buffer(
new T[size]), actingAsMemoryPool(asMemPool) {}
49 ~GenericCircularBuffer() {
delete[] buffer; }
51 [[nodiscard]]
bool available()
const {
return actingAsMemoryPool || readerPosition != writerPosition; }
52 void put(
const T& by) { buffer[nextPosition(&writerPosition)] = by; }
53 T& get() {
return buffer[nextPosition(&readerPosition)]; }
55 int16_t nextPosition(position_ptr_t positionPtr) {
56 bool successfullyUpdated =
false;
58 while(!successfullyUpdated) {
59 existing = atomicRead32(positionPtr);
60 position_t newPos = existing + 1;
61 if (newPos >= bufferSize) {
64 successfullyUpdated = atomicSwap32(positionPtr, existing, newPos);
65#ifdef SC_DEBUG_CHECKER
66 if(!successfullyUpdated) casExchangeSpins++;
73 class SCCircularBuffer {
75 position_t readerPosition;
76 position_t writerPosition;
77 const uint16_t bufferSize;
78 uint8_t *
const buffer;
81 explicit SCCircularBuffer(uint16_t size);
85 [[nodiscard]]
bool available()
const {
return readerPosition != writerPosition; }
92 uint16_t nextPosition(position_ptr_t by)
const;