acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
malloc.cpp
1#include "framework.h"
2#include "acme/memory/allocator/malloc.h"
3#include "acme/platform/system.h"
4#if defined(OPENBSD)
5#include <sys/types.h>
6#include <sys/malloc.h>
7#elif defined(LINUX) || defined(__BSD__)
8#include <malloc.h>
9#elif defined(__APPLE__)
10#include <malloc/malloc.h>
11#endif
12
13
14namespace heap
15{
16
17
18 malloc_allocator::malloc_allocator()
19 {
20
21
22 }
23
24
25 malloc_allocator::~malloc_allocator()
26 {
27
28
29 }
30
31
32 void malloc_allocator::initialize_allocator(::acme::acme * pacme)
33 {
34
35 allocator::initialize_allocator(pacme);
36
37 }
38
39 void * malloc_allocator::allocate(memsize s, memsize * psizeAllocated, const_char_pointer pszAnnotation)
40 {
41
42#ifdef WINDOWS
43
44 auto p = _malloc_base((size_t)s);
45
46#else
47
48 auto p = ::malloc(s);
49
50
51#endif
52
53 if (psizeAllocated)
54 {
55
56 auto sizeAlloc = size(p);
57
58 if (sizeAlloc <= 0)
59 {
60
61 *psizeAllocated = s;
62
63 }
64 else
65 {
66
67 *psizeAllocated = sizeAlloc;
68
69 }
70
71 }
72
73 return p;
74
75 }
76
77
78 void * malloc_allocator::reallocate(void * p, memsize s, const_char_pointer pszAnnotation)
79 {
80#ifdef WINDOWS
81
82 return _realloc_base(p, (size_t)s);
83
84#else
85
86 return ::realloc(p, s);
87
88#endif
89 }
90
91
92 void malloc_allocator::free(void * p)
93 {
94
95#ifdef WINDOWS
96
97 return _free_base(p);
98
99#else
100
101 ::free(p);
102
103#endif
104
105 }
106
107
108 memsize malloc_allocator::size(void * p)
109 {
110
111 //{
112
113#if defined(OPENBSD) || defined(NETBSD)
114
115 return 0;
116
117#elif defined(__APPLE__)
118
119 return malloc_size(p);
120
121#elif defined(WINDOWS)
122
123 return _msize(p);
124
125#else
126
127 return malloc_usable_size(p);
128
129#endif
130
131 //}
132
133 }
134
135
136 bool malloc_allocator::has_size() const
137 {
138
139 return true;
140
141 }
142
143
144 //
145 //
146 //void * operating_system_memory_allocate(memsize size)
147 //{
148 //
149 //
150 //}
151 //
152 //
153 //void * operating_system_memory_reallocate(void * p, memsize size)
154 //{
155 //
156 //
157 //}
158
159
160 //void operating_system_memory_free(void * p)
161 //{
162 //
163 //
164 //}
165
166 //
167 //memsize operating_system_memory_size(void * p)
168 //{
169 //
170 //#ifdef __APPLE__
171 //
172 // return malloc_size(p);
173 //
174 //#elif defined(WINDOWS)
175 //
176 // return _msize(p);
177 //
178 //#else
179 //
180 // return malloc_usable_size(p);
181 //
182 //#endif
183 //
184 //}
185 //
186 void malloc_allocator::check_bounds(::u8 * p)
187 {
188
189 uptr * pinteraction = (uptr *)p;
190
191 ::u8 a[256];
192
193 zero(a);
194
195 if (memory_order(&p[sizeof(uptr)], a, sizeof(a)) != 0)
196 {
197
198 informationf("memory corruption before allocation");
199
200 }
201
202 if (memory_order(&p[sizeof(uptr) + 256 + *pinteraction], a, sizeof(a)) != 0)
203 {
204
205 informationf("memory corruption after allocation");
206
207 }
208
209 }
210
211
212} // namespace heap
213
214
215