51#define MEMORY_TOTAL ((MEMORY << 20) + MEMORY_B)
59#define MEMORY_SPOTS (MEMORY_TOTAL / 100)
86static size_t _memory_spot_size = 0;
92static void _remove_memory_spot(
size_t index) {
93 for (
size_t i =
index; i < _memory_spot_size - 1; i++) {
94 _memory_spots[i] = _memory_spots[i + 1];
96 if (_memory_spot_size > 0) {
112 return (
struct _memory_spot){0, 0};
115 size_t insert_pos = _memory_spot_size;
116 for (
size_t i = 0; i < _memory_spot_size; i++) {
119 for (
size_t j = _memory_spot_size; j > i; j--) {
120 _memory_spots[j] = _memory_spots[j - 1];
128 _memory_spots[insert_pos].
size =
size;
129 if (insert_pos == _memory_spot_size)
132 return _memory_spots[insert_pos];
147 if (_memory_spot_size == 0) {
149 _memory_spots[0].index = 0;
150 _memory_spots[0].size = 0;
151 _memory_spot_size = 1;
154 for (
size_t i = 0; i < _memory_spot_size; i++) {
155 if (_memory_spots[i].size == 0) {
156 size_t start = _memory_spots[i].index;
157 size_t end = (i + 1 < _memory_spot_size) ? _memory_spots[i + 1].index
159 size_t available_size = end - start;
160 if (available_size >= size) {
161 _memory_spots[i].size = size;
163 if (available_size > size) {
164 _add_memory_spot(start + size, 0);
166 return &_memory[start];
171 if (_memory_spot_size > 0) {
172 struct _memory_spot *last = &_memory_spots[_memory_spot_size - 1];
173 size_t end_of_last = last->
index + last->
size;
176 return &_memory[new_spot.
index];
192 char *char_ptr = (
char *)ptr;
193 size_t index = char_ptr - _memory;
197 for (
size_t i = 0; i < _memory_spot_size; i++) {
198 if (_memory_spots[i].
index ==
index && _memory_spots[i].
size > 0) {
199 _memory_spots[i].size = 0;
216 size_t total_size = count *
size;
217 void *ptr =
malloc(total_size);
219 char *p = (
char *)ptr;
220 for (
size_t i = 0; i < total_size; i++) {
244 char *char_ptr = (
char *)ptr;
245 size_t index = char_ptr - _memory;
246 for (
size_t i = 0; i < _memory_spot_size; i++) {
247 if (_memory_spots[i].
index ==
index && _memory_spots[i].
size > 0) {
248 if (_memory_spots[i].
size >=
size) {
256 char *src = (
char *)ptr;
257 char *dst = (
char *)new_ptr;
258 for (
size_t j = 0; j < _memory_spots[i].size; j++) {
#define MEMORY_SPOTS
Definition malloc.h:59
void * malloc(size_t size)
Custom implementation of malloc using a static memory pool.
Definition malloc.h:144
#define MEMORY_TOTAL
Definition malloc.h:51
void * realloc(void *ptr, size_t size)
Custom implementation of realloc for memory allocated by malloc (this custom version).
Definition malloc.h:236
void * calloc(size_t count, size_t size)
Custom implementation of calloc using a static memory pool.
Definition malloc.h:215
void free(void *ptr)
Custom implementation of free for memory allocated by malloc (this custom version).
Definition malloc.h:189
size_t size
Definition malloc.h:70
size_t index
Definition malloc.h:69