12#include <condition_variable>
15#include <boost/circular_buffer.hpp>
25 const std::string& name, std::size_t capacity,
const log4cplus::Logger& logger)
51 bool expected =
false;
53 if (m_closed.compare_exchange_strong(expected,
true)) {
56 buffer_not_empty.notify_all();
72 std::lock_guard lck {mutex};
73 while (cb.size() > 1) {
74 std::optional<T> data_opt =
Poll();
75 if (data_opt && discard_listener) {
76 discard_listener(*data_opt);
86 std::lock_guard lck {mutex};
88 std::optional<T> data_old {};
90 if (cb.full() && discard_listener) {
91 data_old = std::move(cb.front());
94 cb.push_back(std::move(
data));
96 if (data_old && discard_listener) {
97 discard_listener(*data_old);
104 buffer_not_empty.notify_one();
107 if (discard_listener) {
123 std::unique_lock lck {mutex};
126 if (buffer_not_empty.wait_for(lck, timeout, [
this](){return (!cb.empty() || m_closed);})) {
132 T
data = std::move(cb.front());
134 return std::make_optional<T>(std::move(
data));
148 std::lock_guard lck {mutex};
155 std::lock_guard lck {mutex};
162 return std::make_unique<std::scoped_lock<std::recursive_mutex>>(mutex);
168 std::lock_guard lck {mutex};
169 this->discard_listener = discard_listener;
void Close()
Definition circularBufferConcurrent.ipp:47
int Size() const
Definition circularBufferConcurrent.ipp:154
const std::unique_ptr< std::scoped_lock< std::recursive_mutex > > Lock() const
Definition circularBufferConcurrent.ipp:161
std::optional< hlcc::oldbmux::CiiOldbDataPointAsync::OldbDataWithPromise > Poll(std::chrono::milliseconds timeout=std::chrono::milliseconds::zero())
Definition circularBufferConcurrent.ipp:115
CircularBufferConcurrent(const std::string &name, std::size_t capacity, const log4cplus::Logger &logger)
Definition circularBufferConcurrent.ipp:24
boost::circular_buffer< T > & GetCb()
Definition circularBufferConcurrent.ipp:173
~CircularBufferConcurrent()
Definition circularBufferConcurrent.ipp:41
void Clear()
Definition circularBufferConcurrent.ipp:147
void SetDiscardListener(std::function< void(T &)> discard_listener)
Definition circularBufferConcurrent.ipp:167
void Push(T &&data)
Adds new data to the circular buffer.
Definition circularBufferConcurrent.ipp:83
Definition ciiOldbDataPointAsync.hpp:35
ccsinsdetifllnetio::PointingKernelPositions data
Definition pkp_llnetio_subscriber.cpp:29