aboutsummaryrefslogtreecommitdiffstats
path: root/src/malloc.c
diff options
context:
space:
mode:
authorThomas Vanbesien <tvanbesi@proton.me>2026-02-27 10:31:39 +0100
committerThomas Vanbesien <tvanbesi@proton.me>2026-02-27 10:31:39 +0100
commit7de95ddd662b52c803d307b6028fd90a1aa71892 (patch)
tree2bd2a03b20dfe5510cdb74c5b362e6b7f5d9dd13 /src/malloc.c
parent29b8c1556bf456596c6c067d413b65b51e17724e (diff)
downloadmalloc-7de95ddd662b52c803d307b6028fd90a1aa71892.tar.gz
malloc-7de95ddd662b52c803d307b6028fd90a1aa71892.zip
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.
Diffstat (limited to 'src/malloc.c')
-rw-r--r--src/malloc.c43
1 files changed, 38 insertions, 5 deletions
diff --git a/src/malloc.c b/src/malloc.c
index 8982de0..268e0d1 100644
--- a/src/malloc.c
+++ b/src/malloc.c
@@ -1,15 +1,48 @@
/**
* @file malloc.c
- * @brief Stub implementation of malloc.
+ * @brief malloc implementation.
*/
#include "malloc.h"
-#include "libft.h"
+#include "malloc_internal.h"
+
+t_heap g_heap = { 0 };
void *
malloc (size_t size)
{
- (void)size;
- ft_putendl_fd ("MALLOC", 1);
- return (NULL);
+ t_zone **zone_list;
+ t_zone *zone;
+ t_chunk *chunk;
+ size_t alloc_max;
+
+ if (size == 0)
+ size = 1;
+ if (size <= TINY_MAX)
+ {
+ zone_list = &g_heap.tiny;
+ alloc_max = TINY_MAX;
+ }
+ else if (size <= SMALL_MAX)
+ {
+ zone_list = &g_heap.small;
+ alloc_max = SMALL_MAX;
+ }
+ else
+ {
+ zone_list = &g_heap.large;
+ alloc_max = size;
+ }
+ if (*zone_list == NULL)
+ {
+ zone = zone_new (alloc_max);
+ if (zone == NULL)
+ return (NULL);
+ *zone_list = zone;
+ }
+ else
+ zone = *zone_list;
+ chunk = (t_chunk *)((char *)zone + ALIGN (sizeof (t_zone)));
+ chunk->is_free = 0;
+ return ((char *)chunk + ALIGN (sizeof (t_chunk)));
}