hlcc 2.0.0-beta2+pre1
Loading...
Searching...
No Matches
circularBufferConcurrent.hpp
Go to the documentation of this file.
1/*
2 * circularBufferConcurrent.hpp
3 *
4 * Created on: Jul 7, 2021
5 * Author: hsommer
6 */
7#ifndef HLCC_OLDBMUX_CIRCULARBUFFERCONCURRENT_HPP
8#define HLCC_OLDBMUX_CIRCULARBUFFERCONCURRENT_HPP
9
10#include <mutex>
11#include <condition_variable>
12#include <functional>
13#include <optional>
14
15#include <log4cplus/logger.h>
16#include <rad/logger.hpp>
17
18#include <boost/circular_buffer.hpp>
19
20
21// HSO TODO: Check async calls in ProcessRequest in ~/git-rtc/rtctk/componentFramework/services/oldb/src/oldbAdapter.cpp
22
23
24namespace hlcc::oldbmux {
25
48template<typename T>
50{
51public:
52
53 explicit CircularBufferConcurrent(const std::string& name, std::size_t capacity,
54 const log4cplus::Logger& logger);
55
57
60
69 void Push(T&& data);
70
80 std::optional<T> Poll(std::chrono::milliseconds timeout = std::chrono::milliseconds::zero());
81
82 void Clear();
83
84 int Size() const;
85
91 const std::unique_ptr<std::scoped_lock<std::recursive_mutex>> Lock() const;
92
97 void SetDiscardListener(std::function<void(T&)> discard_listener);
98
99
100private:
104 const log4cplus::Logger m_logger;
105
111 boost::circular_buffer<T> cb;
112
126 mutable std::recursive_mutex mutex;
127
134 std::condition_variable_any buffer_not_empty;
135
140 std::function<void(T&)> discard_listener;
141
145 const std::string name;
146
147};
148
149} // end namespace hlcc::oldbmux
150
151// include template class definition from separate header file.
152#include <hlcc/oldbmux/circularBufferConcurrent.ipp>
153
154#endif /* HLCC_OLDBMUX_CIRCULARBUFFERCONCURRENT_HPP */
A first-in first-out buffer with a fixed size that replaces its oldest element if full.
Definition: circularBufferConcurrent.hpp:50
const std::unique_ptr< std::scoped_lock< std::recursive_mutex > > Lock() const
CircularBufferConcurrent(const CircularBufferConcurrent &)=delete
std::optional< T > Poll(std::chrono::milliseconds timeout=std::chrono::milliseconds::zero())
Gets the oldest element from the circular buffer.
CircularBufferConcurrent & operator=(const CircularBufferConcurrent &)=delete
CircularBufferConcurrent(const std::string &name, std::size_t capacity, const log4cplus::Logger &logger)
void SetDiscardListener(std::function< void(T &)> discard_listener)
void Push(T &&data)
Adds new data to the circular buffer.
Definition: ciiOldbDataPointAsync.hpp:30