Skip to content

Commit ce881bf

Browse files
committed
pool: make sure PoolAllocator uses the correct alignment
This changes the PoolAllocator to default the alignment to the given type. This makes the code simpler, and most importantly fixes a bug on ARM 32bit that caused OOM: The class CTxOut has a member CAmount which is an int64_t and on ARM 32bit int64_t are 8 byte aligned which is larger than the pointer alignment of 4 bytes. So for CCoinsMap to be able to use the pool, we need to use the alignment of the member instead of just alignof(void*).
1 parent d752349 commit ce881bf

File tree

4 files changed

+4
-7
lines changed

4 files changed

+4
-7
lines changed

src/bench/pool.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,7 @@ static void PoolAllocator_StdUnorderedMapWithPoolResource(benchmark::Bench& benc
3737
std::hash<uint64_t>,
3838
std::equal_to<uint64_t>,
3939
PoolAllocator<std::pair<const uint64_t, uint64_t>,
40-
sizeof(std::pair<const uint64_t, uint64_t>) + 4 * sizeof(void*),
41-
alignof(void*)>>;
40+
sizeof(std::pair<const uint64_t, uint64_t>) + 4 * sizeof(void*)>>;
4241

4342
// make sure the resource supports large enough pools to hold the node. We do this by adding the size of a few pointers to it.
4443
auto pool_resource = Map::allocator_type::ResourceType();

src/coins.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,7 @@ using CCoinsMap = std::unordered_map<COutPoint,
145145
SaltedOutpointHasher,
146146
std::equal_to<COutPoint>,
147147
PoolAllocator<std::pair<const COutPoint, CCoinsCacheEntry>,
148-
sizeof(std::pair<const COutPoint, CCoinsCacheEntry>) + sizeof(void*) * 4,
149-
alignof(void*)>>;
148+
sizeof(std::pair<const COutPoint, CCoinsCacheEntry>) + sizeof(void*) * 4>>;
150149

151150
using CCoinsMapMemoryResource = CCoinsMap::allocator_type::ResourceType;
152151

src/support/allocators/pool.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ class PoolResource final
272272
/**
273273
* Forwards all allocations/deallocations to the PoolResource.
274274
*/
275-
template <class T, std::size_t MAX_BLOCK_SIZE_BYTES, std::size_t ALIGN_BYTES>
275+
template <class T, std::size_t MAX_BLOCK_SIZE_BYTES, std::size_t ALIGN_BYTES = alignof(T)>
276276
class PoolAllocator
277277
{
278278
PoolResource<MAX_BLOCK_SIZE_BYTES, ALIGN_BYTES>* m_resource;

src/test/pool_tests.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,7 @@ BOOST_AUTO_TEST_CASE(memusage_test)
163163
std::hash<int>,
164164
std::equal_to<int>,
165165
PoolAllocator<std::pair<const int, int>,
166-
sizeof(std::pair<const int, int>) + sizeof(void*) * 4,
167-
alignof(void*)>>;
166+
sizeof(std::pair<const int, int>) + sizeof(void*) * 4>>;
168167
auto resource = Map::allocator_type::ResourceType(1024);
169168

170169
PoolResourceTester::CheckAllDataAccountedFor(resource);

0 commit comments

Comments
 (0)