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