14#include "arcane/mesh/internal/LazyMemoryPool.h"
29LazyMemoryPool::Buffer::
41 std::lock_guard<std::mutex> lk(m_mutex);
42 if (buffer && n <= buffer->m_zeros.size())
44 Buffer* new_buffer = _smallestBuffer(n,
false);
49 new_buffer = _addBuffer(size,
false);
51 return _moveTo(buffer, new_buffer);
60 std::lock_guard<std::mutex> lk(m_mutex);
63 Buffer* new_buffer = _smallestBuffer(n,
true);
65 new_buffer = _addBuffer(n,
true);
66 return _moveTo(buffer, new_buffer);
75 std::lock_guard<std::mutex> lk(m_mutex);
83_smallestBuffer(
Int32 n,
bool only_exact)
85 Buffer* best =
nullptr;
86 for (
const auto& b : m_buffers) {
87 if (only_exact && !b->m_is_exact)
89 if (b->m_zeros.size() < n)
91 if (!best || b->m_zeros.size() < best->m_zeros.size())
100LazyMemoryPool::Buffer* LazyMemoryPool::
101_addBuffer(Int32 size,
bool is_exact)
103 auto b = std::make_unique<Buffer>();
104 b->m_zeros.resize(size);
106 b->m_is_exact = is_exact;
108 m_buffers.push_back(std::move(b));
124 if (buffer != new_buffer) {
125 ++new_buffer->m_nb_reader;
136_release(Buffer*& buffer)
140 --buffer->m_nb_reader;
141 if (buffer->m_nb_reader == 0) {
142 for (
auto& b : m_buffers) {
143 if (b.get() == buffer) {
144 std::swap(b, m_buffers.back());
145 m_buffers.pop_back();
Memory and allocator management functions.
ConstArrayView< T > constView() const
Constant view of this array.
Constant view of an array of type T.
ConstArrayView< Int32 > _moveTo(Buffer *&buffer, Buffer *new_buffer)
Moves the reader of buffer to new_buffer.
std::int32_t Int32
Signed integer type of 32 bits.
One zero buffer and the number of connectivities reading it.