summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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;