diff options
Diffstat (limited to 'asl/memory/allocator.cpp')
-rw-r--r-- | asl/memory/allocator.cpp | 54 |
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 +} |