diff --git a/inc/ft_malloc_internal.h b/inc/ft_malloc_internal.h index 224b40a..d60a494 100644 --- a/inc/ft_malloc_internal.h +++ b/inc/ft_malloc_internal.h @@ -5,8 +5,8 @@ # include # define TINY 512 -# define SMALL 1024 -# define LARGE 1025 +# define SMALL 4096 +# define LARGE 4097 # define START -1 # define MAGIC 0xDEADBEEF # define NALLOC 100 @@ -31,6 +31,7 @@ typedef struct s_arena } t_arena; # define HEAP_SIZE(size) ((size) - sizeof(t_arena)) +# define ARENA_SIZE(size) ((size) + sizeof(t_arena)) extern t_arena g_base; diff --git a/src/malloc.c b/src/malloc.c index 34a5895..6e0c7f8 100644 --- a/src/malloc.c +++ b/src/malloc.c @@ -14,15 +14,15 @@ static size_t get_actual_size(size_t size, int type) if (type == LARGE) minimum = size; else - minimum = (type * NALLOC); - return ((minimum + sizeof(t_arena) + page - 1) / page * page); + minimum = ((CHUNK_SIZE(type)) * NALLOC); + return ((ARENA_SIZE(minimum) + page - 1) / page * page); } static int get_arena_type(size_t size) { - if (size <= TINY) + if (size <= CHUNK_SIZE(TINY)) return (TINY); - if (size <= SMALL) + if (size <= CHUNK_SIZE(SMALL)) return (SMALL); return (LARGE); } diff --git a/t/malloc_tests.c b/t/malloc_tests.c index 6a7c5b9..6608be0 100644 --- a/t/malloc_tests.c +++ b/t/malloc_tests.c @@ -1,7 +1,7 @@ #include "t.h" #include "ft_malloc.h" #include "ft_malloc_internal.h" - +#include int inital_base_next_point_to_itself(void) { @@ -20,14 +20,14 @@ int returns_not_null_pointer(void) ptr = ptr - 1; _IS(ptr->is_free == 0); _IS(ptr->size == 10 + sizeof(t_chunk)); - _IS(ptr->magic == MAGIC); + // _IS(ptr->magic == MAGIC); _IS(ptr->next == NULL); _IS(ptr->prev != NULL); _IS(ptr->prev->size > TINY * NALLOC && ptr->prev->size < SMALL * NALLOC); _END("returns_not_null_pointer"); } -int free_concatenates_andjustent_blocks(void) +int free_concatenates_adjacent_blocks(void) { t_chunk *ptr; t_chunk *next_malloc; @@ -55,13 +55,43 @@ int free_concatenates_andjustent_blocks(void) _IS(heap->prev == NULL); _IS(heap->next == NULL); - _END("free_concatenates_andjustent_blocks"); + _END("free_concatenates_adjacent_blocks"); +} + +int malloc_creates_new_arena(void) +{ + t_chunk *second_arena_chunk; + int chunks_count; + int i; + int page; + g_base.next = &g_base; + page = getpagesize(); + // minimum 100 chunks aligned to page size + chunks_count = (ARENA_SIZE(CHUNK_SIZE(TINY) * NALLOC) + page - 1) + / page * page / CHUNK_SIZE(TINY); + i = 0; + while (i < chunks_count) + { + malloc(TINY); + i++; + } + + _IS(g_base.next->next == &g_base); + _IS(g_base.next->type == TINY); + + second_arena_chunk = malloc(TINY); + + _IS(g_base.next->next != &g_base); + _IS(g_base.next->type == TINY); + _IS(g_base.next->heap->next == second_arena_chunk - 1); + _END("malloc_creates_new_arena"); } int main(void) { _SHOULD(inital_base_next_point_to_itself); _SHOULD(returns_not_null_pointer); - _SHOULD(free_concatenates_andjustent_blocks); + _SHOULD(free_concatenates_adjacent_blocks); + _SHOULD(malloc_creates_new_arena); return 0; } \ No newline at end of file