blob: 8dc14eb111c45624d0da85a5c0634faaf89e5a6d (
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
55
56
57
58
59
60
61
|
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <daw/logging.h>
#include <daw/memory.h>
memory* memory_new(usize max_size) {
memory* m = malloc(sizeof(memory));
m->data = malloc(max_size);
m->size = max_size;
m->pos = 0;
m->free = max_size;
memset(m->data, 0, max_size);
return m;
}
/* Returns a pointer to the allocated data */
void* memory_allocate(memory* mem, usize size) {
void* data = NULL;
if (mem->pos + size <= mem->size) {
data = (void*)((usize)mem->data + mem->pos);
mem->pos += size;
mem->free -= size;
} else {
ERROR("Trying to allocate %lu in a %lu sized memory block", size,
mem->size);
ERROR("No more room!");
exit(EXIT_FAILURE);
}
return data;
}
memory memory_init(void* data, usize size) {
memory m = {0};
m.data = data;
m.size = size;
m.free = 0;
return m;
}
void memory_free(memory* mem, usize size) {
if (size > mem->pos) {
perror("Freeing too much memory!");
exit(EXIT_FAILURE);
} else {
mem->pos -= size;
mem->free += size;
}
}
void memory_clear(memory* mem) {
mem->pos = 0;
mem->free = mem->size;
/* Reset the memory? */
memset(mem->data, 0, mem->size);
}
|