aboutsummaryrefslogtreecommitdiffstats
path: root/test/raytracer/memory.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/raytracer/memory.c')
-rw-r--r--test/raytracer/memory.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/test/raytracer/memory.c b/test/raytracer/memory.c
new file mode 100644
index 00000000..fe194cc9
--- /dev/null
+++ b/test/raytracer/memory.c
@@ -0,0 +1,60 @@
+/* Arena-based memory management */
+
+#include "config.h"
+
+#define SIZE_AREA 1024000
+
+struct area {
+ struct area * next;
+ char data[SIZE_AREA];
+};
+
+struct area * arena_head;
+struct area * arena_cur;
+int arena_cur_ofs;
+
+void arena_init(void)
+{
+ arena_head = malloc(sizeof(struct area));
+ if (arena_head == NULL) {
+ fprintf(stderr, "Out of memory\n");
+ exit(2);
+ }
+ arena_head->next = NULL;
+ arena_cur = arena_head;
+ arena_cur_ofs = 0;
+}
+
+void arena_clear(void)
+{
+ arena_cur = arena_head;
+ arena_cur_ofs = 0;
+}
+
+void * arena_alloc(int size)
+{
+ char * res;
+ struct area * n;
+
+ if (size >= SIZE_AREA) {
+ fprintf(stderr, "Memory request too large (%d)\n", size);
+ exit(2);
+ }
+ if (arena_cur_ofs + size <= SIZE_AREA) {
+ res = arena_cur->data + arena_cur_ofs;
+ arena_cur_ofs += size;
+ return res;
+ }
+ if (arena_cur->next == NULL) {
+ n = malloc(sizeof(struct area));
+ if (n == NULL) {
+ fprintf(stderr, "Out of memory\n");
+ exit(2);
+ }
+ n->next = NULL;
+ arena_cur->next = n;
+ }
+ arena_cur = arena_cur->next;
+ arena_cur_ofs = size;
+ return arena_cur->data;
+}