diff options
Diffstat (limited to 'src/zencore/zencore.cpp')
| -rw-r--r-- | src/zencore/zencore.cpp | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/src/zencore/zencore.cpp b/src/zencore/zencore.cpp index 9c48b355b..b7a2e2dc4 100644 --- a/src/zencore/zencore.cpp +++ b/src/zencore/zencore.cpp @@ -36,6 +36,95 @@ #include <atomic> +struct MemHeader +{ + size_t Size = ~0u; + uint8_t Buffer[64 - sizeof(size_t)]; +}; + +struct MemTail +{ + uint8_t Buffer[64]; +}; + +void +zen_free(void* p) noexcept +{ + MemHeader* Header = (MemHeader*)p; + Header = &Header[-1]; + for (std::size_t HeaderPad = 0; HeaderPad < 64 - sizeof(size_t); HeaderPad++) + { + ZEN_ASSERT(Header->Buffer[HeaderPad] == 0x7f); + } + const size_t PadAlignment = 8; + std::size_t AlignedSize = (Header->Size + PadAlignment - 1) & ~(PadAlignment - 1); + std::size_t PadSize = AlignedSize - Header->Size; + uint8_t* TailPtr = (uint8_t*)(p); + TailPtr += Header->Size; + std::size_t TailSize = PadSize + sizeof(MemTail); + for (std::size_t TailPad = 0; TailPad < TailSize; TailPad++) + { + ZEN_ASSERT(TailPtr[TailPad] == 0x7f); + } +#if ZEN_PLATFORM_WINDOWS + _aligned_free((void*)Header); +#else + std::free(ptr); +#endif +} + +void +zen_free_size(void* p, std::size_t n) noexcept +{ + ZEN_UNUSED(n); + zen_free(p); +} + +void* +zen_new(std::size_t n) noexcept +{ + return zen_new_aligned(n, 1); +} + +void* +zen_new_aligned(std::size_t n, size_t al) noexcept +{ + const size_t PadAlignment = 8; + std::size_t AlignedSize = (n + PadAlignment - 1) & ~(PadAlignment - 1); + + size_t alloc_size = sizeof(MemHeader) + AlignedSize + sizeof(MemTail); + +#if ZEN_PLATFORM_WINDOWS + void* Ptr = _aligned_malloc(alloc_size, al); +#else + void* Ptr = std::aligned_alloc(Alignment, alloc_size); +#endif + + MemHeader* Header = (MemHeader*)Ptr; + memset(Header, 0x7f, sizeof(MemHeader)); + Header->Size = n; + void* Result = &Header[1]; + std::size_t PadSize = AlignedSize - n; + uint8_t* TailPtr = (uint8_t*)(Result); + TailPtr += n; + memset(TailPtr, 0x7f, PadSize + sizeof(MemTail)); + return Result; +} + +void +zen_free_aligned(void* p, size_t al) noexcept +{ + ZEN_UNUSED(al); + zen_free(p); +} + +void +zen_free_size_aligned(void* p, std::size_t n, size_t al) noexcept +{ + ZEN_UNUSED(n, al); + zen_free(p); +} + namespace zen::assert { void |