From 2156e95c2c7f59b46d75f8e4405356fb724c519e Mon Sep 17 00:00:00 2001 From: timothy lee Date: Thu, 31 Jul 2025 17:21:56 +0800 Subject: [PATCH 1/2] added peekat function into double buffer and buffer interface --- src/core/include/core/buffer/buffer_interface.hpp | 6 ++++++ src/core/include/core/buffer/double_buffer.hpp | 13 ++++++++++++- src/core/include/core/buffer/ring_buffer.hpp | 2 +- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/core/include/core/buffer/buffer_interface.hpp b/src/core/include/core/buffer/buffer_interface.hpp index 555b485..4e13118 100644 --- a/src/core/include/core/buffer/buffer_interface.hpp +++ b/src/core/include/core/buffer/buffer_interface.hpp @@ -35,6 +35,12 @@ class BufferInterface : public BufferBase { /// \return 0 if failed, otherwise the number of bytes written (1) virtual std::size_t Write(const T& data) = 0; + /// \brief Peek at data at a specific position without consuming it + /// \param data reference to store the peeked data + /// \param n position to peek at (0 = oldest, GetOccupiedSize()-1 = newest) + /// \return 0 if failed, otherwise 1 + virtual std::size_t PeekAt(T& data, std::size_t n) const = 0; + /// \brief Read data from the buffer (burst read) /// \param data /// \return 0 if failed, otherwise the number of bytes read diff --git a/src/core/include/core/buffer/double_buffer.hpp b/src/core/include/core/buffer/double_buffer.hpp index 46c2fd4..ba4a364 100644 --- a/src/core/include/core/buffer/double_buffer.hpp +++ b/src/core/include/core/buffer/double_buffer.hpp @@ -61,11 +61,22 @@ class DoubleBuffer : public BufferInterface { return true; } + std::size_t PeekAt(T& data, std::size_t n) const override { + std::lock_guard lock(mutex_); + if (n != 0 || !ready_.load(std::memory_order_acquire)) { + return 0; + } + + int read_index = 1 - write_index_; + data = buffer_[read_index]; + return 1; + } + private: T buffer_[2]; int write_index_; std::atomic ready_{false}; - std::mutex mutex_; + mutable std::mutex mutex_; std::condition_variable cond_var_; }; } // namespace quickviz diff --git a/src/core/include/core/buffer/ring_buffer.hpp b/src/core/include/core/buffer/ring_buffer.hpp index fe54b5b..f84cb6c 100644 --- a/src/core/include/core/buffer/ring_buffer.hpp +++ b/src/core/include/core/buffer/ring_buffer.hpp @@ -162,7 +162,7 @@ class RingBuffer : public BufferInterface { return 1; } - std::size_t PeekAt(T& data, size_t n) const { + std::size_t PeekAt(T& data, size_t n) const override { std::lock_guard lock(buffer_mutex_); // return 0 if requested data is beyond the available range if (n >= (write_index_ - read_index_) & size_mask_) return 0; From 27525420d41c51106fb093d6a527edda510172ca Mon Sep 17 00:00:00 2001 From: timothy lee Date: Thu, 31 Jul 2025 18:06:06 +0800 Subject: [PATCH 2/2] buffer: added peek function in interface --- src/core/include/core/buffer/buffer_interface.hpp | 5 ++--- src/core/include/core/buffer/double_buffer.hpp | 4 ++-- src/core/include/core/buffer/ring_buffer.hpp | 11 ++++++++++- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/core/include/core/buffer/buffer_interface.hpp b/src/core/include/core/buffer/buffer_interface.hpp index 4e13118..2cc36c6 100644 --- a/src/core/include/core/buffer/buffer_interface.hpp +++ b/src/core/include/core/buffer/buffer_interface.hpp @@ -35,11 +35,10 @@ class BufferInterface : public BufferBase { /// \return 0 if failed, otherwise the number of bytes written (1) virtual std::size_t Write(const T& data) = 0; - /// \brief Peek at data at a specific position without consuming it + /// \brief Peek at the most recent data without consuming it /// \param data reference to store the peeked data - /// \param n position to peek at (0 = oldest, GetOccupiedSize()-1 = newest) /// \return 0 if failed, otherwise 1 - virtual std::size_t PeekAt(T& data, std::size_t n) const = 0; + virtual std::size_t Peek(T& data) const = 0; /// \brief Read data from the buffer (burst read) /// \param data diff --git a/src/core/include/core/buffer/double_buffer.hpp b/src/core/include/core/buffer/double_buffer.hpp index ba4a364..452b204 100644 --- a/src/core/include/core/buffer/double_buffer.hpp +++ b/src/core/include/core/buffer/double_buffer.hpp @@ -61,9 +61,9 @@ class DoubleBuffer : public BufferInterface { return true; } - std::size_t PeekAt(T& data, std::size_t n) const override { + std::size_t Peek(T& data) const { std::lock_guard lock(mutex_); - if (n != 0 || !ready_.load(std::memory_order_acquire)) { + if (!ready_.load(std::memory_order_acquire)) { return 0; } diff --git a/src/core/include/core/buffer/ring_buffer.hpp b/src/core/include/core/buffer/ring_buffer.hpp index f84cb6c..f5423c5 100644 --- a/src/core/include/core/buffer/ring_buffer.hpp +++ b/src/core/include/core/buffer/ring_buffer.hpp @@ -138,6 +138,15 @@ class RingBuffer : public BufferInterface { return count; } + // Get the most recent data + std::size_t Peek(T& data) const override { + std::lock_guard lock(buffer_mutex_); + std::size_t occupied_size = (write_index_ - read_index_) & size_mask_; + if (occupied_size == 0) return 0; + data = buffer_[(write_index_ - 1) & size_mask_]; + return 1; + } + std::size_t Write(const std::vector& new_data, std::size_t btw) override { assert(new_data.size() >= btw); std::lock_guard lock(buffer_mutex_); @@ -162,7 +171,7 @@ class RingBuffer : public BufferInterface { return 1; } - std::size_t PeekAt(T& data, size_t n) const override { + std::size_t PeekAt(T& data, size_t n) const { std::lock_guard lock(buffer_mutex_); // return 0 if requested data is beyond the available range if (n >= (write_index_ - read_index_) & size_mask_) return 0;