From 36dc194c28c911961b71288867e426f9f415f354 Mon Sep 17 00:00:00 2001 From: gbrochar Date: Fri, 11 Jul 2025 14:49:29 +0200 Subject: [PATCH] feat: free (untested) --- main.c | 1 + src/free.c | 27 ++++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/main.c b/main.c index 494d941..37244ea 100644 --- a/main.c +++ b/main.c @@ -9,6 +9,7 @@ int main(int argc, char **argv) { size = (rand() & 0x7ff) | 0xf00000; arr = (int *)ft_malloc(size * sizeof(int)); printf ("arr %d addr: %p arr size: %zu\n", i, arr, size); + free(arr); } show_alloc_sizes(); return 0; diff --git a/src/free.c b/src/free.c index 909aa91..f71c157 100644 --- a/src/free.c +++ b/src/free.c @@ -2,6 +2,31 @@ void free(void *ptr) { pthread_mutex_lock(&g_malloc_mutex); - (void)ptr; + t_block *block = (t_block *)((char *)ptr - sizeof(t_block)); + if (block->size < g_zones.small_block_max_size) { + block->free = 1; + } else { + t_block *curr = g_zones.large_blocks; + if (curr == NULL) { + pthread_mutex_unlock(&g_malloc_mutex); + return; + } + if ((char *)curr + sizeof(t_block) == (char *)ptr) { + g_zones.large_blocks = curr->next; + munmap((char *)ptr - sizeof(t_block) - (16 - sizeof(t_block) % 16), curr->size + sizeof(t_block) + (16 - sizeof(t_block) % 16)); + pthread_mutex_unlock(&g_malloc_mutex); + return; + } + while ((char *)curr->next + sizeof(t_block) != (char *)ptr) { + curr = curr->next; + if (curr == NULL) { + pthread_mutex_unlock(&g_malloc_mutex); + return; + } + } + t_block *to_free = curr->next; + curr->next = curr->next->next; + munmap((char *)ptr - sizeof(t_block) - (16 - sizeof(t_block) % 16), to_free->size + sizeof(t_block) + (16 - sizeof(t_block) % 16)); + } pthread_mutex_unlock(&g_malloc_mutex); }