summary refs log tree commit diff
diff options
context:
space:
mode:
authorWormHeamer2025-02-28 21:10:47 -0500
committerWormHeamer2025-02-28 21:10:47 -0500
commita051895b87c1bc7d7d397349726c9a175713d2d1 (patch)
tree9df54de8191ea0a85484951087c812e470812c02
parent49436e2b1ede2851068c0adb04851abd2160c6c7 (diff)
have ZONE_MIN_CAPACITY instead of ZONE_CAPACITY
gets bumped up to the nearest full page size for ZONE_USE_MMAP
-rw-r--r--zone.h19
1 files changed, 14 insertions, 5 deletions
diff --git a/zone.h b/zone.h
index 4161bb9..2f653df 100644
--- a/zone.h
+++ b/zone.h
@@ -3,6 +3,8 @@
 
 #include <stdint.h>
 
+#define ZONE_MIN_CAPACITY 1024
+
 #define ZONE_USE_MALLOC 0
 #define ZONE_USE_MMAP   1
 
@@ -53,7 +55,6 @@ char *zn_strdup(Zone *z, const char *s);
 	#include <sys/mman.h>
 	#include <unistd.h>
 
-	#define ZONE_CAPACITY ((sysconf(_SC_PAGE_SIZE) * 2 - sizeof(ZoneFrame))/sizeof(uintptr_t))
 	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) {
@@ -65,10 +66,16 @@ char *zn_strdup(Zone *z, const char *s);
 	static void zn_zf_free(ZoneFrame *zf) {
 		munmap(zf, sizeof *zf + zf->capacity * sizeof(uintptr_t));
 	}
+	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);
+		cap += pg_size - (cap % pg_size);
+		return cap - hdr_size;
+	}
 
 #elif ZONE_BACKEND == ZONE_USE_MALLOC
 
-	#define ZONE_CAPACITY 1024
 	static ZoneFrame *zn_zf_allocate(size_t capacity) {
 		ZoneFrame *zf = malloc(sizeof *zf + capacity * sizeof(uintptr_t));
 		if (!zf) {
@@ -80,6 +87,10 @@ char *zn_strdup(Zone *z, const char *s);
 	static void zn_zf_free(ZoneFrame *zf) {
 		free(zf);
 	}
+	static size_t zn_zf_capacity(size_t cap) {
+		if (cap < ZONE_MIN_CAPACITY) cap = ZONE_MIN_CAPACITY;
+		return cap;
+	}
 
 #else
 
@@ -110,9 +121,7 @@ void *zn_zf_alloc(Zone *z, ZoneFrame **zfo, size_t n) {
 		}
 	}
 	if (!zf) {
-		size_t cap = ZONE_CAPACITY;
-		while (wordsz >= cap) cap <<= 1; 
-		zf = zn_zf_new(cap);
+		zf = zn_zf_new(zn_zf_capacity(wordsz));
 		zf->prev = z->tail;
 		if (z->tail) z->tail->next = zf;
 		z->tail = zf;