aboutsummaryrefslogtreecommitdiff
path: root/memory.h
diff options
context:
space:
mode:
authorAryadev Chavali <aryadev@aryadevchavali.com>2025-05-09 18:29:52 +0100
committerAryadev Chavali <aryadev@aryadevchavali.com>2025-05-09 18:29:52 +0100
commitba5c0a4579ece5d53c009a14d00e683e70b982f4 (patch)
treead7e6788b8ce634172f9a5cdee0a1a9ac08c7788 /memory.h
parent576bf0f3085022e9117d78e3b4e19971c82a61d6 (diff)
downloadoats-ba5c0a4579ece5d53c009a14d00e683e70b982f4.tar.gz
oats-ba5c0a4579ece5d53c009a14d00e683e70b982f4.tar.bz2
oats-ba5c0a4579ece5d53c009a14d00e683e70b982f4.zip
Initial implementation
Diffstat (limited to 'memory.h')
-rw-r--r--memory.h66
1 files changed, 66 insertions, 0 deletions
diff --git a/memory.h b/memory.h
new file mode 100644
index 0000000..bbd4d45
--- /dev/null
+++ b/memory.h
@@ -0,0 +1,66 @@
+/* Copyright (C) 2025 Aryadev Chavali
+
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License Version 2 for
+ * details.
+
+ * You may distribute and modify this code under the terms of the GNU General
+ * Public License Version 2, which you should have received a copy of along with
+ * this program. If not, please go to <https://www.gnu.org/licenses/>.
+
+ * Created: 2025-04-05
+ * Description: Memory management structures
+ */
+
+#ifndef MEMORY_H
+#define MEMORY_H
+
+#include "./base.h"
+#include <stdio.h>
+
+#define PAGE_DEFAULT_SIZE 1024
+#define MEMORY_ALIGNMENT 8
+
+typedef struct Page
+{
+ struct Page *next;
+ u64 size, capacity;
+ u8 data[];
+} page_t;
+
+page_t *page_create(u64 size);
+void page_resize(page_t **page, u64 newsize);
+// Append - fail (by returning <0) if not enough space.
+i64 page_append(page_t *page, void *data, u64 size);
+// Append - will resize if necessary
+u64 page_rappend(page_t **page, void *data, u64 size);
+
+typedef struct Aren
+{
+ page_t *start, *end;
+} arena_t;
+
+void *arena_alloc(arena_t *arena, u64 size);
+void *arena_realloc(arena_t *arena, void *ptr, u64 oldsize, u64 newsize);
+void *arena_copy(arena_t *arena, void *ptr, u64 size);
+void arena_attach(arena_t *arena, page_t *page);
+void arena_reset(arena_t *arena);
+void arena_cleanup(arena_t *arena);
+
+typedef struct Context
+{
+ arena_t memory, read, scratch;
+} context_t;
+
+void *context_alloc(context_t *context, u64 size);
+void *context_salloc(context_t *context, u64 size);
+page_t *context_get_read_page(context_t *ctx);
+void context_reset_read(context_t *context);
+void context_reset_scratch(context_t *context);
+
+void context_reset(context_t *context);
+void context_cleanup(context_t *context);
+void context_report(context_t *context);
+
+#endif