From 7de95ddd662b52c803d307b6028fd90a1aa71892 Mon Sep 17 00:00:00 2001 From: Thomas Vanbesien Date: Fri, 27 Feb 2026 10:31:39 +0100 Subject: Add zone allocation, internal data structures, and README Implement mmap-based zone allocation for TINY (<=128B) and SMALL (<=1024B) categories. malloc now creates zones on demand and returns a pointer to the first chunk. --- src/zone.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 src/zone.c (limited to 'src/zone.c') diff --git a/src/zone.c b/src/zone.c new file mode 100644 index 0000000..724237b --- /dev/null +++ b/src/zone.c @@ -0,0 +1,42 @@ +/** + * @file zone.c + * @brief Zone allocation via mmap. + */ + +#include "malloc_internal.h" +#include +#include + +static size_t +_s_zone_size (size_t alloc_max) +{ + size_t chunk_size; + size_t total; + size_t page_size; + + chunk_size = ALIGN (sizeof (t_chunk)) + ALIGN (alloc_max); + total = ALIGN (sizeof (t_zone)) + MIN_ALLOC_COUNT * chunk_size; + page_size = (size_t)getpagesize (); + return ((total + page_size - 1) & ~(page_size - 1)); +} + +t_zone * +zone_new (size_t alloc_max) +{ + size_t zone_size; + t_zone *zone; + t_chunk *chunk; + + zone_size = _s_zone_size (alloc_max); + zone = mmap (NULL, zone_size, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (zone == MAP_FAILED) + return (NULL); + zone->next = NULL; + zone->size = zone_size; + chunk = (t_chunk *)((char *)zone + ALIGN (sizeof (t_zone))); + chunk->size = zone_size - ALIGN (sizeof (t_zone)) - ALIGN (sizeof (t_chunk)); + chunk->next = NULL; + chunk->is_free = 1; + return (zone); +} -- cgit v1.2.3