summaryrefslogtreecommitdiff
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;