IPPL (Independent Parallel Particle Layer)
IPPL
Loading...
Searching...
No Matches
BufferHandler.hpp
Go to the documentation of this file.
1#ifndef IPPL_BUFFER_HANDLER_HPP
2#define IPPL_BUFFER_HANDLER_HPP
3
4namespace ippl {
5
6 template <typename MemorySpace>
8
9 template <typename MemorySpace>
12 size_type requiredSize = static_cast<size_type>(size * overallocation);
13
14 auto freeBuffer = findFreeBuffer(requiredSize);
15 if (freeBuffer != nullptr) {
17 }
18
19 if (!free_buffers.empty()) {
20 return reallocateLargestFreeBuffer(requiredSize);
21 }
22
23 return allocateNewBuffer(requiredSize);
24 }
25
26 template <typename MemorySpace>
28 if (isBufferUsed(buffer)) {
29 releaseUsedBuffer(buffer);
30 }
31 }
32
33 template <typename MemorySpace>
41
42 template <typename MemorySpace>
50
51 template <typename MemorySpace>
56
57 template <typename MemorySpace>
62
63 template <typename MemorySpace>
65 const buffer_type& rhs) {
66 if (lhs->getBufferSize() != rhs->getBufferSize()) {
67 return lhs->getBufferSize() < rhs->getBufferSize();
68 }
69
70 // Use memory address as a tie-breaker to enforce total ordering of buffers.
71 return lhs < rhs;
72 }
73
74 template <typename MemorySpace>
76 return used_buffers.find(buffer) != used_buffers.end();
77 }
78
79 template <typename MemorySpace>
81 auto it = used_buffers.find(buffer);
82
83 usedSize_m -= buffer->getBufferSize();
84 freeSize_m += buffer->getBufferSize();
85
86 used_buffers.erase(it);
87 free_buffers.insert(buffer);
88 }
89
90 template <typename MemorySpace>
93 auto it = findSmallestSufficientBuffer(requiredSize);
94 if (it != free_buffers.end()) {
95 return *it;
96 }
97 return nullptr;
98 }
99
100 template <typename MemorySpace>
101 typename DefaultBufferHandler<MemorySpace>::buffer_set_type::iterator
103 return std::find_if(free_buffers.begin(), free_buffers.end(),
104 [requiredSize](const buffer_type& buffer) {
105 return buffer->getBufferSize() >= requiredSize;
106 });
107 }
108
109 template <typename MemorySpace>
112 freeSize_m -= buffer->getBufferSize();
113 usedSize_m += buffer->getBufferSize();
114
115 free_buffers.erase(buffer);
116 used_buffers.insert(buffer);
117 return buffer;
118 }
119
120 template <typename MemorySpace>
123 auto largest_it = std::prev(free_buffers.end());
124 buffer_type buffer = *largest_it;
125
126 freeSize_m -= buffer->getBufferSize();
127 usedSize_m += requiredSize;
128
129 free_buffers.erase(buffer);
130 buffer->reallocBuffer(requiredSize);
131
132 used_buffers.insert(buffer);
133 return buffer;
134 }
135
136 template <typename MemorySpace>
139 buffer_type newBuffer = std::make_shared<archive_type>(requiredSize);
140
141 usedSize_m += newBuffer->getBufferSize();
142 used_buffers.insert(newBuffer);
143 return newBuffer;
144 }
145
146} // namespace ippl
147
148#endif
Definition Archive.h:20
ippl::detail::size_type size_type
std::shared_ptr< archive_type > buffer_type
void releaseUsedBuffer(buffer_type buffer)
buffer_type reallocateLargestFreeBuffer(size_type requiredSize)
size_type freeSize_m
Total size of all free buffers.
size_type usedSize_m
Total size of all allocated buffers.
buffer_type getFreeBuffer(buffer_type buffer)
size_type getUsedSize() const override
Frees a specified buffer.
buffer_set_type used_buffers
Set of used buffers.
void deleteAllBuffers() override
Frees a specified buffer.
bool isBufferUsed(buffer_type buffer) const
static bool bufferSizeComparator(const buffer_type &lhs, const buffer_type &rhs)
buffer_type findFreeBuffer(size_type requiredSize)
void freeBuffer(buffer_type buffer) override
Frees a specified buffer.
buffer_type getBuffer(size_type size, double overallocation) override
Acquires a buffer of at least the specified size.
buffer_type allocateNewBuffer(size_type requiredSize)
void freeAllBuffers() override
Frees a specified buffer.
buffer_set_type::iterator findSmallestSufficientBuffer(size_type requiredSize)
buffer_set_type free_buffers
Set of free buffers.
size_type getFreeSize() const override
Frees a specified buffer.