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