diff options
author | WormHeamer | 2025-03-04 22:17:11 -0500 |
---|---|---|
committer | WormHeamer | 2025-03-04 22:20:16 -0500 |
commit | 4a91b9eb70e878bc1f5b52dcfe05c671a25c06e4 (patch) | |
tree | e73f9fc359d55e1240654c8e533c3dc2e4c9db21 | |
parent | 3ea6826e8e4ea39d0521a3a44ccbad322eaed73c (diff) |
always allocate in "pages," even on malloc
-rw-r--r-- | zone.h | 57 |
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; |