summaryrefslogtreecommitdiff
path: root/src/memory.c
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);
}