diff options
author | WormHeamer | 2025-02-28 21:10:47 -0500 |
---|---|---|
committer | WormHeamer | 2025-02-28 21:10:47 -0500 |
commit | a051895b87c1bc7d7d397349726c9a175713d2d1 (patch) | |
tree | 9df54de8191ea0a85484951087c812e470812c02 | |
parent | 49436e2b1ede2851068c0adb04851abd2160c6c7 (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.h | 19 |
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; |