summaryrefslogtreecommitdiff
path: root/asl/memory/allocator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'asl/memory/allocator.cpp')
-rw-r--r--asl/memory/allocator.cpp54
1 files changed, 54 insertions, 0 deletions
diff --git a/asl/memory/allocator.cpp b/asl/memory/allocator.cpp
new file mode 100644
index 0000000..504202d
--- /dev/null
+++ b/asl/memory/allocator.cpp
@@ -0,0 +1,54 @@
+#include "asl/memory/allocator.hpp"
+#include "asl/base/assert.hpp"
+#include "asl/memory/layout.hpp"
+
+#include <cstdlib>
+
+// @Todo zalloc
+// @Todo Cookies
+// @Todo Debug values
+
+void* asl::GlobalHeap::alloc(const layout& layout)
+{
+#if ASL_OS_WINDOWS
+ void* ptr = ::_aligned_malloc(
+ static_cast<size_t>(layout.size),
+ static_cast<size_t>(layout.align));
+#elif ASL_OS_LINUX
+ void* ptr = ::aligned_alloc(
+ static_cast<size_t>(layout.align),
+ static_cast<size_t>(layout.size));
+#endif
+ ASL_ASSERT(ptr != nullptr); // @Todo panic
+ return ptr;
+}
+
+void* asl::GlobalHeap::realloc(void* old_ptr, [[maybe_unused]] const layout& old_layout, const layout& new_layout)
+{
+#if ASL_OS_WINDOWS
+ return ::_aligned_realloc(old_ptr,
+ static_cast<size_t>(new_layout.size),
+ static_cast<size_t>(new_layout.align));
+#elif ASL_OS_LINUX
+ if (new_layout.align <= old_layout.align)
+ {
+ void* new_ptr = ::realloc(old_ptr, static_cast<size_t>(new_layout.size));
+ ASL_ASSERT(new_ptr != nullptr); // @Todo panic
+ return new_ptr;
+ }
+
+ void* new_ptr = alloc(new_layout);
+ asl::memcpy(new_ptr, old_ptr, asl::min(old_layout.size, new_layout.size));
+ dealloc(old_ptr, old_layout);
+ return new_ptr;
+#endif
+}
+
+void asl::GlobalHeap::dealloc(void* ptr, const layout&)
+{
+#if ASL_OS_WINDOWS
+ ::_aligned_free(ptr);
+#elif ASL_OS_LINUX
+ ::free(ptr);
+#endif
+}