diff --git a/inc/malloc.h b/inc/malloc.h index f74afbd..2bf08ee 100644 --- a/inc/malloc.h +++ b/inc/malloc.h @@ -40,10 +40,9 @@ typedef struct s_zones { extern pthread_mutex_t g_malloc_mutex; extern t_zones g_zones; -void *malloc(size_t size); void *ft_malloc(size_t size); -void free(void *ptr); -void *realloc(void *ptr, size_t size); +void ft_free(void *ptr); +void *ft_realloc(void *ptr, size_t size); void show_alloc_mem(void); void show_alloc_mem_ex(void); diff --git a/main.c b/main.c index 37244ea..1a52ae1 100644 --- a/main.c +++ b/main.c @@ -3,14 +3,37 @@ int main(int argc, char **argv) { srand(argv[1][0]+argv[1][1]+argv[1][2]); - int *arr; + int **arr = (int **)ft_malloc(atoi(argv[2]) * sizeof(int *)); size_t size; for (int i = 0; i < atoi(argv[2]); i++) { 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); + arr[i] = (int *)ft_malloc(size * sizeof(int)); + printf ("arr %d addr: %p arr size: %zu\n", i, arr[i], size); + //ft_free(arr); } + ft_free(arr[3]); + ft_free(arr[5]); + ft_free(arr[1]); + ft_free(arr[6]); + ft_free(arr[2]); + ft_free(arr[4]); + ft_free(arr[0]); + ft_free(arr[7]); +// for (int i = 0; i < atoi(argv[2]); i++) { +// ft_free(arr[i]); +// } + printf("second round\n"); + for (int i = 0; i < atoi(argv[2]); i++) { + size = (rand() & 0x7ff) | 0xf00000; + arr[i] = (int *)ft_malloc(size * sizeof(int)); + printf ("arr %d addr: %p arr size: %zu\n", i, arr[i], size); + //ft_free(arr); + } + for (int i = 0; i < atoi(argv[2]); i++) { + ft_free(arr[i]); + } + printf("free arr"); + ft_free(arr); show_alloc_sizes(); return 0; } diff --git a/src/free.c b/src/free.c index f71c157..eafcb31 100644 --- a/src/free.c +++ b/src/free.c @@ -1,6 +1,6 @@ #include "malloc.h" -void free(void *ptr) { +void ft_free(void *ptr) { pthread_mutex_lock(&g_malloc_mutex); t_block *block = (t_block *)((char *)ptr - sizeof(t_block)); if (block->size < g_zones.small_block_max_size) { diff --git a/src/malloc.c b/src/malloc.c index eb24946..b630b80 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -22,7 +22,7 @@ void *malloc_tiny(size_t size) { } zone->head = (t_block *)addr; curr = zone->head; - printf("addr of g_zones.tiny_zones : %p\n" + /*printf("addr of g_zones.tiny_zones : %p\n" "addr of zone : %p\n" "addr of *head %p\n" "sizeof tzone : %zu\n" @@ -31,7 +31,7 @@ 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; @@ -87,7 +87,7 @@ void *malloc_small(size_t size) { } zone->head = (t_block *)addr; curr = zone->head; - printf("addr of g_zones.small_zones : %p\n" + /*printf("addr of g_zones.small_zones : %p\n" "addr of zone : %p\n" "addr of *head %p\n" "sizeof tzone : %zu\n" @@ -96,7 +96,7 @@ 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; @@ -134,7 +134,8 @@ void *malloc_large(size_t size) { t_block *curr = g_zones.large_blocks; if (curr == NULL) { // TODO protect mmap - curr = (t_block *)((char *)mmap(NULL, size + sizeof(t_block) + (16 - sizeof(t_block) % 16), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) + (16 - sizeof(t_block) % 16)); + g_zones.large_blocks = (t_block *)((char *)mmap(NULL, size + sizeof(t_block) + (16 - sizeof(t_block) % 16), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) + (16 - sizeof(t_block) % 16)); + curr = g_zones.large_blocks; curr->size = size; curr->free = 0; curr->next = NULL; diff --git a/test.sh b/test.sh index b3d20fa..85b6a15 100755 --- a/test.sh +++ b/test.sh @@ -1,4 +1,4 @@ #!/bin/sh make gcc main.c libft_malloc.so -o malloc_test.out -LD_LIBRARY_PATH=. LD_PRELOAD=./libft_malloc.so ./malloc_test.out $1 $2 +LD_LIBRARY_PATH=. LD_PRELOAD=./libft_malloc.so ./malloc_test.out $@