Align ArenaImpl allocation to alignof(ArenaImpl)
All checks were successful
Tests / Clang total: 1096, passed: 1096
Clang |Total|New|Outstanding|Fixed|Trend |:-:|:-:|:-:|:-:|:-: |0|0|0|0|:clap:
Tests / SIMD fallback total: 1096, passed: 1096
Tests / Release [gcc] total: 1096, passed: 1096
GNU C Compiler (gcc) |Total|New|Outstanding|Fixed|Trend |:-:|:-:|:-:|:-:|:-: |0|0|0|0|:clap:
Tests / Release [gcc,aarch64] total: 824, passed: 824
Tests / Coverage total: 823, passed: 823
weaselab/conflict-set/pipeline/head This commit looks good

Fixes #20
This commit is contained in:
2024-04-01 17:31:16 -07:00
parent dbc6f2313a
commit dea8d6ae01

View File

@@ -154,6 +154,7 @@ inline void *operator new[](size_t size, std::align_val_t align,
/// align must be a power of two /// align must be a power of two
template <class T> T *align_up(T *t, size_t align) { template <class T> T *align_up(T *t, size_t align) {
assert(std::popcount(align) == 1);
auto unaligned = uintptr_t(t); auto unaligned = uintptr_t(t);
auto aligned = (unaligned + align - 1) & ~(align - 1); auto aligned = (unaligned + align - 1) & ~(align - 1);
return reinterpret_cast<T *>(reinterpret_cast<char *>(t) + aligned - return reinterpret_cast<T *>(reinterpret_cast<char *>(t) + aligned -
@@ -162,6 +163,7 @@ template <class T> T *align_up(T *t, size_t align) {
/// align must be a power of two /// align must be a power of two
constexpr inline int align_up(uint32_t unaligned, uint32_t align) { constexpr inline int align_up(uint32_t unaligned, uint32_t align) {
assert(std::popcount(align) == 1);
return (unaligned + align - 1) & ~(align - 1); return (unaligned + align - 1) & ~(align - 1);
} }
@@ -180,7 +182,7 @@ struct Arena::ArenaImpl {
inline Arena::Arena(int initialSize) : impl(nullptr) { inline Arena::Arena(int initialSize) : impl(nullptr) {
if (initialSize > 0) { if (initialSize > 0) {
auto allocationSize = auto allocationSize =
align_up(initialSize + sizeof(ArenaImpl), sizeof(ArenaImpl)); align_up(initialSize + sizeof(ArenaImpl), alignof(ArenaImpl));
impl = (Arena::ArenaImpl *)safe_malloc(allocationSize); impl = (Arena::ArenaImpl *)safe_malloc(allocationSize);
impl->prev = nullptr; impl->prev = nullptr;
impl->capacity = allocationSize - sizeof(ArenaImpl); impl->capacity = allocationSize - sizeof(ArenaImpl);
@@ -216,7 +218,7 @@ inline void *operator new(size_t size, std::align_val_t align, Arena &arena) {
(arena.impl ? std::max<int>(sizeof(Arena::ArenaImpl), (arena.impl ? std::max<int>(sizeof(Arena::ArenaImpl),
arena.impl->capacity * 2) arena.impl->capacity * 2)
: 0)), : 0)),
sizeof(Arena::ArenaImpl)); alignof(Arena::ArenaImpl));
auto *impl = (Arena::ArenaImpl *)safe_malloc(allocationSize); auto *impl = (Arena::ArenaImpl *)safe_malloc(allocationSize);
impl->prev = arena.impl; impl->prev = arena.impl;
impl->capacity = allocationSize - sizeof(Arena::ArenaImpl); impl->capacity = allocationSize - sizeof(Arena::ArenaImpl);