From 31806c45944225e0507fed90f32af64f4afe2a3d Mon Sep 17 00:00:00 2001 From: gbrochar Date: Fri, 4 Jul 2025 17:58:36 +0200 Subject: [PATCH] feat: malloc init, thread safety --- inc/malloc.h | 48 +++++++++++++++++++++++++++++++++++++++++++++--- main.c | 6 +++++- src/free.c | 7 +++++++ src/init.c | 26 ++++++++++++++++++++++++++ src/malloc.c | 8 +++++--- src/realloc.c | 10 ++++++++++ src/utils.c | 14 ++++++++++++++ test.sh | 4 ++-- 8 files changed, 114 insertions(+), 9 deletions(-) create mode 100644 src/free.c create mode 100644 src/init.c create mode 100644 src/realloc.c create mode 100644 src/utils.c diff --git a/inc/malloc.h b/inc/malloc.h index 628ab1a..69bb9f7 100644 --- a/inc/malloc.h +++ b/inc/malloc.h @@ -1,11 +1,53 @@ #ifndef MALLOC_H # define MALLOC_H -#include -#include +# include +# include +# include +# include -#define PROUT "42\n" +// TODO Remove me (printf) +# include + +#define MAX_ALIGNMENT 16 + +typedef struct s_block t_block; +typedef struct s_zone t_zone; + +struct s_block { + size_t size; + int free; + t_block *next; +}; + +struct s_zone { + t_block *head; + t_zone *next; +}; + +typedef struct s_zones { + size_t pagesize; + size_t max_align; + size_t tiny_block_max_size; + size_t small_block_max_size; + t_zone *tiny_zones; + t_zone *small_zones; + t_block *large_blocks; +} t_zones; + +extern pthread_mutex_t g_malloc_mutex; +extern t_zones g_zones; void *malloc(size_t size); +void free(void *ptr); +void *realloc(void *ptr, size_t size); + +void show_alloc_mem(void); +void show_alloc_mem_ex(void); +void show_alloc_sizes(void); + +static void init_malloc(void); +void init_tiny_zones(void); +void init_small_zones(void); #endif diff --git a/main.c b/main.c index a199598..22bbea9 100644 --- a/main.c +++ b/main.c @@ -1,6 +1,10 @@ #include +#include "inc/malloc.h" int main(void) { - malloc(42); + int *arr = malloc(42); + arr = realloc(arr, 42); + free(arr); + show_alloc_sizes(); return 0; } diff --git a/src/free.c b/src/free.c new file mode 100644 index 0000000..909aa91 --- /dev/null +++ b/src/free.c @@ -0,0 +1,7 @@ +#include "malloc.h" + +void free(void *ptr) { + pthread_mutex_lock(&g_malloc_mutex); + (void)ptr; + pthread_mutex_unlock(&g_malloc_mutex); +} diff --git a/src/init.c b/src/init.c new file mode 100644 index 0000000..3042da6 --- /dev/null +++ b/src/init.c @@ -0,0 +1,26 @@ +#include "malloc.h" + +pthread_mutex_t g_malloc_mutex; +t_zones g_zones; + +void init_tiny_zones(void) { + g_zones.tiny_block_max_size = g_zones.pagesize / 2; + g_zones.tiny_zones = (t_zone *)mmap(NULL, g_zones.tiny_block_max_size * 128, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + g_zones.tiny_zones->head = NULL; + g_zones.tiny_zones->next = NULL; +} + +void init_small_zones(void) { + g_zones.small_block_max_size = g_zones.tiny_block_max_size * 128; + g_zones.small_zones = (t_zone *)mmap(NULL, g_zones.small_block_max_size * 128, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + g_zones.small_zones->head = NULL; + g_zones.small_zones->next = NULL; +} + +__attribute__((constructor)) +static void init_malloc(void) { + g_zones.pagesize = (size_t)sysconf(_SC_PAGESIZE); + g_zones.max_align = MAX_ALIGNMENT; + init_tiny_zones(); + init_small_zones(); +} diff --git a/src/malloc.c b/src/malloc.c index bc3d02a..b279512 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -1,7 +1,9 @@ #include "malloc.h" -void * malloc(size_t size) { +void *malloc(size_t size) { + pthread_mutex_lock(&g_malloc_mutex); (void)size; - write(1, PROUT, 3); - return 0; + write(1, "42 from malloc\n", 15); + pthread_mutex_unlock(&g_malloc_mutex); + return NULL; } diff --git a/src/realloc.c b/src/realloc.c new file mode 100644 index 0000000..825ba2c --- /dev/null +++ b/src/realloc.c @@ -0,0 +1,10 @@ +#include "malloc.h" + +void *realloc(void *ptr, size_t size) { + pthread_mutex_lock(&g_malloc_mutex); + write(1, "1337\n", 5); + (void)size; + (void)ptr; + pthread_mutex_unlock(&g_malloc_mutex); + return ptr; +} diff --git a/src/utils.c b/src/utils.c new file mode 100644 index 0000000..105f57c --- /dev/null +++ b/src/utils.c @@ -0,0 +1,14 @@ +#include "malloc.h" + +void show_alloc_mem(void) { +} + +void show_alloc_mem_ex(void) { +} + +void show_alloc_sizes(void) { + // TODO remove me (printf) + printf("PAGESIZE : %zu bytes\n", g_zones.pagesize); + printf("TINY ZONE MAX BLOCK SIZE: %zu bytes\n", g_zones.tiny_block_max_size); + printf("SMALL ZONE MAX BLOCK SIZE : %zu bytes\n", g_zones.small_block_max_size); +} diff --git a/test.sh b/test.sh index fb172f0..d8e2d31 100755 --- a/test.sh +++ b/test.sh @@ -1,4 +1,4 @@ #!/bin/sh make -gcc main.c -o test_malloc.out -LD_PRELOAD=./libft_malloc.so ./test_malloc.out +gcc main.c libft_malloc.so -o malloc_test.out +LD_LIBRARY_PATH=. LD_PRELOAD=./libft_malloc.so ./malloc_test.out