From 4121fcd7fd4dc5007ccdeb37ebfcaa8c7e1beef8 Mon Sep 17 00:00:00 2001 From: gbrochar Date: Thu, 17 Jul 2025 12:28:27 +0200 Subject: [PATCH] chore: upload save --- any_test.sh | 3 +++ inc/malloc.h | 2 ++ src/free.c | 18 ++++++------------ src/init.c | 6 ++++++ src/malloc.c | 36 ++++++++++++++++++++++++++---------- src/realloc.c | 2 ++ 6 files changed, 45 insertions(+), 22 deletions(-) create mode 100755 any_test.sh diff --git a/any_test.sh b/any_test.sh new file mode 100755 index 0000000..7f31e4a --- /dev/null +++ b/any_test.sh @@ -0,0 +1,3 @@ +#!/bin/sh +make +LD_LIBRARY_PATH=. LD_PRELOAD=./libft_malloc.so $@ diff --git a/inc/malloc.h b/inc/malloc.h index 6113771..157401c 100644 --- a/inc/malloc.h +++ b/inc/malloc.h @@ -5,6 +5,7 @@ # include # include # include +# include // TODO Remove me (printf) # include @@ -40,6 +41,7 @@ typedef struct s_zones { extern pthread_mutex_t g_malloc_mutex; extern t_zones g_zones; +size_t malloc_usable_size(void *ptr); void *malloc(size_t size); void free(void *ptr); void *realloc(void *ptr, size_t size); diff --git a/src/free.c b/src/free.c index da01f26..86b543d 100644 --- a/src/free.c +++ b/src/free.c @@ -1,46 +1,40 @@ #include "malloc.h" void free(void *ptr) { - write(1, "free\n", 5); + ft_printf("free %p\n", ptr); pthread_mutex_lock(&g_malloc_mutex); - write(1, "free\n", 5); if (ptr == NULL) { ft_printf("free null\n"); pthread_mutex_unlock(&g_malloc_mutex); return; } t_block *block = (t_block *)((char *)ptr - sizeof(t_block)); - write(1, "free\n", 5); if (block->size < g_zones.small_block_max_size) { - write(1, "rree\n", 5); block->free = 1; } else { - write(1, "1\n", 2); t_block *curr = g_zones.large_blocks; if (curr == NULL) { - write(1, "E\n", 2); pthread_mutex_unlock(&g_malloc_mutex); - return; + return; } if ((char *)curr + sizeof(t_block) == (char *)ptr) { - write(1, "2\n", 2); 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)); + 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; + return; } while ((char *)curr->next + sizeof(t_block) != (char *)ptr) { curr = curr->next; if (curr == NULL) { write(1, "e\n", 2); pthread_mutex_unlock(&g_malloc_mutex); - return; + return; } } - write(1, "3\n", 2); 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); } + diff --git a/src/init.c b/src/init.c index 5663b17..2ff2429 100644 --- a/src/init.c +++ b/src/init.c @@ -30,3 +30,9 @@ static void init_malloc(void) { g_zones.large_blocks = NULL; } +__attribute__((destructor)) +static void dest_malloc(void) { + ft_printf("Destructor called\n"); + show_alloc_mem(); +} + diff --git a/src/malloc.c b/src/malloc.c index 704f753..fafb997 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -4,7 +4,7 @@ t_zone *create_new_tiny_zone(void) { t_zone *zone; // TODO protect mmap zone = (t_zone *)mmap(NULL, g_zones.tiny_zone_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - zone->head = NULL; + zone->head = NULL; zone->next = NULL; return zone; } @@ -22,7 +22,7 @@ void *malloc_tiny(size_t size) { } zone->head = (t_block *)addr; curr = zone->head; - ft_printf("addr of g_zones.tiny_zones : %p\n" +/* ft_printf("addr of g_zones.tiny_zones : %p\n" "addr of zone : %p\n" "addr of *head %p\n" "sizeof tzone : %d\n" @@ -31,10 +31,11 @@ void *malloc_tiny(size_t size) { zone, curr, sizeof(t_zone), - sizeof(t_block)); + sizeof(t_block));*/ curr->size = size; curr->free = 0; curr->next = NULL; + ft_printf("returning %p\n", (void *)((char *)(curr) + sizeof(t_block))); return (void *)((char *)(curr) + sizeof(t_block)); } else { @@ -54,6 +55,7 @@ void *malloc_tiny(size_t size) { curr->size = size; curr->free = 0; curr->next = NULL; + ft_printf("returning %p\n", (void *)((char *)(curr) + sizeof(t_block))); return (void *)((char *)curr + sizeof(t_block)); } if (zone->next == NULL) { @@ -70,7 +72,7 @@ t_zone *create_new_small_zone(void) { t_zone *zone; // TODO protect mmap zone = (t_zone *)mmap(NULL, g_zones.small_zone_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - zone->head = NULL; + zone->head = NULL; zone->next = NULL; return zone; } @@ -88,7 +90,7 @@ void *malloc_small(size_t size) { } zone->head = (t_block *)addr; curr = zone->head; - ft_printf("addr of g_zones.small_zones : %p\n" + /*ft_printf("addr of g_zones.small_zones : %p\n" "addr of zone : %p\n" "addr of *head %p\n" "sizeof tzone : %d\n" @@ -97,10 +99,11 @@ void *malloc_small(size_t size) { zone, curr, sizeof(t_zone), - sizeof(t_block)); + sizeof(t_block));*/ curr->size = size; curr->free = 0; curr->next = NULL; + ft_printf("returning %p\n", (void *)((char *)(curr) + sizeof(t_block))); return (void *)((char *)(curr) + sizeof(t_block)); } else { @@ -120,6 +123,7 @@ void *malloc_small(size_t size) { curr->size = size; curr->free = 0; curr->next = NULL; + ft_printf("returning %p\n", (void *)((char *)(curr) + sizeof(t_block))); return (void *)((char *)curr + sizeof(t_block)); } if (zone->next == NULL) { @@ -141,6 +145,7 @@ void *malloc_large(size_t size) { curr->size = size; curr->free = 0; curr->next = NULL; + ft_printf("returning %p\n", (void *)((char *)(curr) + sizeof(t_block))); return (void *)((char *)curr + sizeof(t_block)); } while (curr->next) { @@ -152,24 +157,35 @@ void *malloc_large(size_t size) { curr->size = size; curr->free = 0; curr->next = NULL; + ft_printf("returning %p\n", (void *)((char *)(curr) + sizeof(t_block))); return (void *)((char *)curr + sizeof(t_block)); } void *malloc(size_t size) { pthread_mutex_lock(&g_malloc_mutex); - ft_printf("malloc %d\n", size); void *ptr = NULL; if (size < g_zones.tiny_block_max_size) { - write(1, "malloc tiny\n", 12); + ft_printf("malloc tiny %d\n", size); ptr = malloc_tiny(size); } else if (size < g_zones.small_block_max_size) { - write(1, "malloc small\n", 13); + ft_printf("malloc small %d\n", size); ptr = malloc_small(size); } else { - write(1, "malloc large\n", 13); + ft_printf("malloc large %d\n", size); ptr = malloc_large(size); } pthread_mutex_unlock(&g_malloc_mutex); return ptr; } +size_t malloc_usable_size(void *ptr) { + show_alloc_mem(); + ft_printf("on est la %p\n", ptr); + if (!ptr) { + return 0; + } + t_block *block = (t_block *)((char *)ptr - sizeof(t_block)); + ft_printf("on est la %d\n", block->size); + return block->size; +} + diff --git a/src/realloc.c b/src/realloc.c index 0fd3cad..eefe1f2 100644 --- a/src/realloc.c +++ b/src/realloc.c @@ -83,5 +83,7 @@ void *realloc(void *ptr, size_t size) { ft_printf("exiting\n"); show_alloc_mem(); pthread_mutex_unlock(&g_malloc_mutex); + ft_printf("returning\n"); return ptr; } +