RTC Toolkit 5.0.0
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/memory.hpp"
16#include "numapp/mempolicy.hpp"
20#include <atomic>
21#include <boost/lockfree/policies.hpp>
22#include <boost/lockfree/stack.hpp>
23#include <cstdint>
24#include <fmt/core.h>
25#include <gsl/span>
26#include <gtest/gtest.h>
27#include <memory>
28#include <optional>
29
31
33public:
34 explicit NoBufferAvailableException(const std::string& buffer_name);
35};
36
47private:
48 class BufferStorage;
49
50public:
54 using Buffer = gsl::span<uint8_t>;
56 public:
57 // non-copyable and non-movable
58 BufferReference() = delete;
60 void operator=(const BufferReference&) = delete;
62 void operator=(BufferReference&&) = delete;
63
67 operator Buffer() const;
68
72 Buffer GetBuffer() const;
73
78 BufferReference(const Buffer buffer, std::shared_ptr<BufferStorage> storage);
79
80 private:
81 const Buffer m_buffer;
82 const std::shared_ptr<BufferStorage> m_storage;
83 };
84 BufferManager() = delete;
94 BufferManager(const size_t buffer_size,
96 const std::string& description,
97 const std::string& prefix,
98 const size_t buffers,
99 const std::optional<numapp::MemPolicy>& policy = {});
100
105 std::shared_ptr<BufferReference> Get();
106
110 std::shared_ptr<BufferReference> BlockingGet();
111
112private:
113 class BufferStorage {
114 public:
115 // do not allow copy or default construction
116 BufferStorage() = delete;
117 BufferStorage(const BufferStorage&) = delete;
118 BufferStorage& operator=(const BufferStorage&) = delete;
122 BufferStorage(size_t buffer_count, std::shared_ptr<uint8_t[]> buffer_storage);
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;
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:119
void operator=(const BufferReference &)=delete
~BufferReference()
Definition bufferManager.cpp:123
BufferManager is a class that will allocate a big buffer and spit it up in several cache-aligned sub-...
Definition bufferManager.hpp:46
gsl::span< uint8_t > Buffer
The span definition of a subbuffer.
Definition bufferManager.hpp:54
std::shared_ptr< BufferReference > Get()
Get a new buffer from the pool, throws when no buffers are available.
Definition bufferManager.cpp:65
std::shared_ptr< BufferReference > BlockingGet()
Same as get, but will not throw but blocks until buffer is free.
Definition bufferManager.cpp:74
Component metrics interface.
Definition componentMetricsIf.hpp:85
NoBufferAvailableException(const std::string &buffer_name)
Definition bufferManager.cpp:20
The RtctkException class is the base class for all Rtctk exceptions.
Definition exceptions.hpp:211
Header file for ComponentMetricsIf.
Provides macros and utilities for exception handling.
Definition commandReplier.cpp:22
elt::mal::future< std::string > InjectReqRepEvent(StateMachineEngine &engine)
Definition malEventInjector.hpp:23