RTC Toolkit 6.0.0
Loading...
Searching...
No Matches
bufferManager.hpp
Go to the documentation of this file.
1
11#ifndef RTCTK_COMPONENTFRAMEWORK_BUFFERMANAGER_HPP
12#define RTCTK_COMPONENTFRAMEWORK_BUFFERMANAGER_HPP
13
14#include "numapp/mempolicy.hpp"
18#include <atomic>
19#include <boost/lockfree/policies.hpp>
20#include <boost/lockfree/stack.hpp>
21#include <cstdint>
22#include <fmt/core.h>
23#include <gsl/span>
24#include <gtest/gtest.h>
25#include <memory>
26#include <optional>
27
29
31public:
32 explicit NoBufferAvailableException(const std::string& buffer_name);
33};
34
45private:
46 class BufferStorage;
47
48public:
52 using Buffer = gsl::span<uint8_t>;
54 public:
55 // non-copyable and non-movable
56 BufferReference() = delete;
58 void operator=(const BufferReference&) = delete;
60 void operator=(BufferReference&&) = delete;
61
65 operator Buffer() const;
66
70 Buffer GetBuffer() const;
71
76 BufferReference(const Buffer buffer, std::shared_ptr<BufferStorage> storage);
77
78 private:
79 const Buffer m_buffer;
80 const std::shared_ptr<BufferStorage> m_storage;
81 };
82 BufferManager() = delete;
92 BufferManager(const size_t buffer_size,
93 ComponentMetricsIf& metrics,
94 const std::string& description,
95 const std::string& prefix,
96 const size_t buffers,
97 const std::optional<numapp::MemPolicy>& policy = {});
98
103 std::shared_ptr<BufferReference> Get();
104
108 std::shared_ptr<BufferReference> BlockingGet();
109
110private:
111 class BufferStorage {
112 public:
113 // do not allow copy or default construction
114 BufferStorage() = delete;
115 BufferStorage(const BufferStorage&) = delete;
116 BufferStorage& operator=(const BufferStorage&) = delete;
120 BufferStorage(
121 size_t buffer_count,
122 std::shared_ptr<uint8_t[]> buffer_storage); // NOLINT(modernize-avoid-c-arrays)
126 void Return(Buffer buffer);
130 void Add(Buffer buffer);
134 std::optional<Buffer> Get();
138 size_t Used();
139
140 private:
141 boost::lockfree::stack<Buffer, boost::lockfree::fixed_sized<true>> m_buffer_stack;
142 std::shared_ptr<uint8_t[]> m_buffer_storage; // NOLINT(modernize-avoid-c-arrays)
143 std::atomic<size_t> m_used;
144 };
145
146 std::shared_ptr<BufferStorage> m_storage;
147 const size_t m_buffers;
148 BufferMonitor<> m_buffer_monitor;
149 const std::string m_description;
150
151 FRIEND_TEST(TestBufferManager, Internal);
152};
153
154} // namespace rtctk::componentFramework
155
156#endif // RTCTK_COMPONENTFRAMEWORK_BUFFERMANAGER_HPP
Header file for Buffer Monitor.
Buffer GetBuffer() const
Return span to the buffer.
Definition bufferManager.cpp:117
void operator=(const BufferReference &)=delete
~BufferReference()
Definition bufferManager.cpp:121
gsl::span< uint8_t > Buffer
The span definition of a subbuffer.
Definition bufferManager.hpp:52
std::shared_ptr< BufferReference > Get()
Get a new buffer from the pool, throws when no buffers are available.
Definition bufferManager.cpp:62
std::shared_ptr< BufferReference > BlockingGet()
Same as get, but will not throw but blocks until buffer is free.
Definition bufferManager.cpp:71
Component metrics interface.
Definition componentMetricsIf.hpp:163
NoBufferAvailableException(const std::string &buffer_name)
Definition bufferManager.cpp:21
RtctkException() noexcept
Definition exceptions.cpp:112
Header file for ComponentMetricsIf.
Provides macros and utilities for exception handling.
Definition commandReplier.cpp:21