diff options
Diffstat (limited to 'src/util/HugeAllocator.hxx')
-rw-r--r-- | src/util/HugeAllocator.hxx | 42 |
1 files changed, 21 insertions, 21 deletions
diff --git a/src/util/HugeAllocator.hxx b/src/util/HugeAllocator.hxx index 421cf7da4..765b4fc6b 100644 --- a/src/util/HugeAllocator.hxx +++ b/src/util/HugeAllocator.hxx @@ -30,6 +30,7 @@ #ifndef HUGE_ALLOCATOR_HXX #define HUGE_ALLOCATOR_HXX +#include "WritableBuffer.hxx" #include "Compiler.h" #include <utility> @@ -44,9 +45,12 @@ * need it anymore. On the downside, this call is expensive. * * Throws std::bad_alloc on error + * + * @returns the allocated buffer with a size which may be rounded up + * (to the next page size), so callers can take advantage of this + * allocation overhead */ -gcc_malloc -void * +WritableBuffer<void> HugeAllocate(size_t size); /** @@ -77,8 +81,7 @@ HugeDiscard(void *p, size_t size) noexcept; #elif defined(WIN32) #include <windows.h> -gcc_malloc -void * +WritableBuffer<void> HugeAllocate(size_t size); static inline void @@ -104,11 +107,10 @@ HugeDiscard(void *p, size_t size) noexcept #include <stdint.h> -gcc_malloc -static inline void * +WritableBuffer<void> HugeAllocate(size_t size) { - return new uint8_t[size]; + return {new uint8_t[size], size}; } static inline void @@ -134,46 +136,44 @@ HugeDiscard(void *, size_t) noexcept * Automatic huge memory allocation management. */ class HugeAllocation { - void *data = nullptr; - size_t size; + WritableBuffer<void> buffer = nullptr; public: HugeAllocation() = default; explicit HugeAllocation(size_t _size) - :data(HugeAllocate(_size)), size(_size) {} + :buffer(HugeAllocate(_size)) {} HugeAllocation(HugeAllocation &&src) noexcept - :data(std::exchange(src.data, nullptr)), size(src.size) {} + :buffer(std::exchange(src.buffer, nullptr)) {} ~HugeAllocation() { - if (data != nullptr) - HugeFree(data, size); + if (buffer != nullptr) + HugeFree(buffer.data, buffer.size); } HugeAllocation &operator=(HugeAllocation &&src) noexcept { - std::swap(data, src.data); - std::swap(size, src.size); + std::swap(buffer, src.buffer); return *this; } void ForkCow(bool enable) noexcept { - HugeForkCow(data, size, enable); + HugeForkCow(buffer.data, buffer.size, enable); } void Discard() noexcept { - HugeDiscard(data, size); + HugeDiscard(buffer.data, buffer.size); } void reset() noexcept { - if (data != nullptr) { - HugeFree(data, size); - data = nullptr; + if (buffer != nullptr) { + HugeFree(buffer.data, buffer.size); + buffer = nullptr; } } void *get() noexcept { - return data; + return buffer.data; } }; |