From c1f2933bda67e1a76630015dce88250acd6a2130 Mon Sep 17 00:00:00 2001 From: Raphael Steiner Date: Thu, 2 Apr 2026 07:27:29 +0200 Subject: [PATCH] removed read modify write from ringbuffer --- include/RingBuffer/RingBuffer.hpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/include/RingBuffer/RingBuffer.hpp b/include/RingBuffer/RingBuffer.hpp index b6e78a8..8c2ab5b 100644 --- a/include/RingBuffer/RingBuffer.hpp +++ b/include/RingBuffer/RingBuffer.hpp @@ -52,8 +52,8 @@ class alignas(CACHE_LINE_SIZE) RingBuffer { inline std::size_t getTailPosition() const noexcept; inline std::size_t getHeadPosition() const noexcept; - inline void advanceTail(const std::size_t n = 1U) noexcept; - inline void advanceHead(const std::size_t n = 1U) noexcept; + inline void updateTail(const std::size_t n) noexcept; + inline void updateHead(const std::size_t n) noexcept; public: inline constexpr std::size_t capacity() const noexcept; @@ -106,13 +106,13 @@ inline std::size_t RingBuffer::getHeadPosition() const noexcept { }; template -inline void RingBuffer::advanceTail(const std::size_t n) noexcept { - tailCounter_.fetch_add(n, std::memory_order_release); +inline void RingBuffer::updateTail(const std::size_t n) noexcept { + tailCounter_.store(n, std::memory_order_release); }; template -inline void RingBuffer::advanceHead(const std::size_t n) noexcept { - headCounter_.fetch_add(n, std::memory_order_release); +inline void RingBuffer::updateHead(const std::size_t n) noexcept { + headCounter_.store(n, std::memory_order_release); }; /** @@ -161,7 +161,7 @@ inline std::optional RingBuffer::pop() noexcept { || ((cachedHeadCounter_ = headCounter_.load(std::memory_order_acquire)) != tail)) { const std::size_t pos = tail % N; std::optional val(data_[pos]); - advanceTail(); + updateTail(tail + 1U); return val; } else { return std::optional(std::nullopt); @@ -176,7 +176,7 @@ inline bool RingBuffer::pop(T &out) noexcept { if (hasData) { const std::size_t pos = tail % N; out = data_[pos]; - advanceTail(); + updateTail(tail + 1U); } return hasData; } @@ -190,7 +190,7 @@ inline bool RingBuffer::push(const T value) noexcept { || ((cachedTailCounter_ = tailCounter_.load(std::memory_order_acquire)) != headLoopAround); if (nonFull) { data_[head % N] = value; - advanceHead(); + updateHead(head + 1U); } return nonFull; } @@ -226,7 +226,7 @@ inline bool RingBuffer::push(InputIt first, InputIt last) noexcept { std::advance(first, numElementsFirstPush); std::copy_n(std::execution::unseq, first, numElementsSecondPush, data_.begin()); - advanceHead(numElements); + updateHead(head + numElements); } return enoughSpace; }