summaryrefslogtreecommitdiff
path: root/asl/allocator.cpp
blob: 8fbca4ea875f7460a7b9ba37875c5141b8f25005 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include "asl/allocator.hpp"
#include "asl/assert.hpp"
#include "asl/utility.hpp"
#include "asl/memory.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.size),
        static_cast<size_t>(layout.align));
#endif
    ASL_ASSERT(ptr != nullptr); // @Todo panic
    return ptr;
}

void* asl::GlobalHeap::realloc(void* old_ptr, 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));
    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
}