aboutsummaryrefslogtreecommitdiff
path: root/src/zencore/zencore.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/zencore/zencore.cpp')
-rw-r--r--src/zencore/zencore.cpp89
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