summary refs log tree commit diff
diff options
context:
space:
mode:
authorWormHeamer2025-03-04 22:17:11 -0500
committerWormHeamer2025-03-04 22:20:16 -0500
commit4a91b9eb70e878bc1f5b52dcfe05c671a25c06e4 (patch)
treee73f9fc359d55e1240654c8e533c3dc2e4c9db21
parent3ea6826e8e4ea39d0521a3a44ccbad322eaed73c (diff)
always allocate in "pages," even on malloc
-rw-r--r--zone.h57
1 files changed, 26 insertions, 31 deletions
diff --git a/zone.h b/zone.h
index b5aeee5..1617feb 100644
--- a/zone.h
+++ b/zone.h
@@ -58,45 +58,33 @@ void *zn_zeroed(void *, size_t);
 	#endif
 #endif
 
+#ifndef ZONE_PAGE_MULT
+#define ZONE_PAGE_MULT 2
+#endif
+
 #if ZONE_BACKEND == ZONE_USE_MMAP
 
 	#include <sys/mman.h>
 	#include <unistd.h>
 
-	static ZoneFrame *zn_zf_allocate(size_t capacity) {
-		ZoneFrame *zf = mmap(NULL, sizeof *zf + capacity * sizeof(uintptr_t), PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
-		if (!zf) {
-			fprintf(stderr, "failed to allocate memory zone frame\n");
-			abort();
-		}
-		return zf;
-	}
-	static void zn_zf_free(ZoneFrame *zf) {
-		munmap(zf, (uintptr_t)zf->end - (uintptr_t)zf);
+	#define ZONE_PAGE_SIZE (ZONE_PAGE_MULT * sysconf(_SC_PAGE_SIZE))
+
+	static void *zn_pg_alloc(size_t n) {
+		return mmap(NULL, n * ZONE_PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
 	}
-	static size_t zn_zf_capacity(size_t cap) {
-		if (cap < ZONE_MIN_CAPACITY) cap = ZONE_MIN_CAPACITY;
-		size_t pg_size = sysconf(_SC_PAGE_SIZE) / sizeof(uintptr_t);
-		size_t hdr_size = sizeof(ZoneFrame) / sizeof(uintptr_t);
-		return cap + (-cap & (pg_size - 1)) - hdr_size;
+	static void zn_pg_free(void *p, size_t n) {
+		munmap(p, n);
 	}
 
 #elif ZONE_BACKEND == ZONE_USE_MALLOC
 
-	static ZoneFrame *zn_zf_allocate(size_t capacity) {
-		ZoneFrame *zf = malloc(sizeof *zf + capacity * sizeof(uintptr_t));
-		if (!zf) {
-			fprintf(stderr, "failed to allocate memory zone frame\n");
-			abort();
-		}
-		return zf;
-	}
-	static void zn_zf_free(ZoneFrame *zf) {
-		free(zf);
+	#define ZONE_PAGE_SIZE (ZONE_PAGE_MULT * 4 * 1024)
+
+	static void zn_pg_alloc(size_t n) {
+		eturn malloc(n * ZONE_PAGE_SIZE);
 	}
-	static size_t zn_zf_capacity(size_t cap) {
-		if (cap < ZONE_MIN_CAPACITY) cap = ZONE_MIN_CAPACITY;
-		return cap;
+	static void zn_pg_free(void *p, size_t n) {
+		free(p);
 	}
 
 #else
@@ -105,9 +93,12 @@ void *zn_zeroed(void *, size_t);
 
 #endif
 
+static inline size_t zn_pg_fit(size_t cap) {
+	return cap + (-cap & (ZONE_PAGE_SIZE - 1));
+}
+
 static ZoneFrame *zn_zf_new(size_t capacity) {
-	capacity = zn_zf_capacity(capacity);
-	ZoneFrame *zf = zn_zf_allocate(capacity);
+	ZoneFrame *zf = zn_pg_alloc(capacity / ZONE_PAGE_SIZE);
 	zf->prev = NULL;
 	zf->next = NULL;
 	zf->beg = zf->data;
@@ -115,6 +106,10 @@ static ZoneFrame *zn_zf_new(size_t capacity) {
 	return zf;
 }
 
+static void zn_zf_free(ZoneFrame *z) {
+	zn_pg_free(z, (uintptr_t)z->end - (uintptr_t)z->beg);
+}
+
 #define PTR_ALIGN(ptr, align) (typeof(ptr))((uint8_t*)ptr + ((-(uintptr_t)ptr) & ((align)-1)))
 
 void *zn_alloc_align(Zone *z, ptrdiff_t n, size_t align) {
@@ -123,7 +118,7 @@ void *zn_alloc_align(Zone *z, ptrdiff_t n, size_t align) {
 		zf = zf->next;
 	}
 	if (!zf) {
-		zf = zn_zf_new(n + align - 1);
+		zf = zn_zf_new(zn_pg_fit(n + sizeof(ZoneFrame) + align - 1));
 		zf->prev = z->tail;
 		if (z->tail) z->tail->next = zf;
 		z->tail = zf;