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); }