From 053c0773deb90045bf14dd8ea0166c76c9ac1571 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Thu, 16 Feb 2017 15:48:29 +0100 Subject: [PATCH] some work done on splitting, free() next --- malloc/includes/malloc.h | 34 ++++++++------- malloc/libft_malloc_x86_64_Darwin.so | Bin 38292 -> 38876 bytes malloc/main.c | 22 ++++++++-- malloc/myprogram | Bin 8496 -> 8648 bytes malloc/src/malloc.c | 51 ++++++++++++++++------- malloc/src/show_alloc_mem.c | 59 ++++++++++++++++++++++----- 6 files changed, 124 insertions(+), 42 deletions(-) diff --git a/malloc/includes/malloc.h b/malloc/includes/malloc.h index 8598e563..13526d2e 100644 --- a/malloc/includes/malloc.h +++ b/malloc/includes/malloc.h @@ -1,14 +1,17 @@ #ifndef MALLOC_H # define MALLOC_H -#define malloc_n 20 -#define malloc_m 100 -#define malloc_N 100 -#define malloc_M 500 -#define malloc_magic 1234567 -#define TINY(x) (x < (malloc_n + 1)) -#define SMALL(x) (!TINY(x) && !LARGE(x)) -#define LARGE(x) (malloc_m < x) +# define malloc_n 64 +# define malloc_m 512 +# define malloc_N (1 * getpagesize()) +# define malloc_M (2 * getpagesize()) +# define malloc_magic 1234567 +# define malloc_realign(x) ((((x) + 1) / 8) * 8) +# define malloc_bytes(x) (((x) + 1) / 8) +# define HEADER_SIZE malloc_bytes(sizeof(t_node)) +# define TINY(x) (x < (malloc_n + 1)) +# define SMALL(x) (!TINY(x) && !LARGE(x)) +# define LARGE(x) (malloc_m < x) #include "../libft/includes/libft.h" #include @@ -23,12 +26,15 @@ typedef struct s_node { struct s_node *next; } t_node; -extern t_node *tiny_head; -extern t_node *small_head; +extern t_node *tiny_zone; +extern t_node *small_zone; +extern t_node *tiny_alloc; +extern t_node *small_alloc; -void free(void *ptr); -void *malloc(size_t size); -void *realloc(void *ptr, size_t size); -void show_alloc_mem(void); +void free(void *ptr); +void *malloc(size_t size); +void *realloc(void *ptr, size_t size); +void show_alloc_mem(void); +void show_free_mem(void); #endif diff --git a/malloc/libft_malloc_x86_64_Darwin.so b/malloc/libft_malloc_x86_64_Darwin.so index a97431330641e2dcc0f20ca5f1e041cedae2b3ef..541b837859924acfc97225780df32a7c691c9f87 100755 GIT binary patch delta 9990 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 L3*!E5tHk~fd&(G$ delta 8852 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 diff --git a/malloc/main.c b/malloc/main.c index d2b8fb26..3b962dbd 100644 --- a/malloc/main.c +++ b/malloc/main.c @@ -4,10 +4,24 @@ int main(void) { void *ptr; - ptr = malloc(10); - ptr = malloc(42); - ptr = malloc(3); - ptr = malloc(15); + printf("pagesize=[%i]\n", getpagesize()); + printf("sizeof(long)=[%lu]\n", sizeof(long)); + printf("sizeof(t_node)=[%lu]\n", sizeof(t_node)); + ptr = malloc(1 * sizeof(long)); show_alloc_mem(); + ft_putchar('\n'); + + ptr = malloc(84 * sizeof(long)); + show_alloc_mem(); + ft_putchar('\n'); + + ptr = malloc(65 * sizeof(long)); + show_alloc_mem(); + ft_putchar('\n'); + + ptr = malloc(64 * sizeof(long)); + show_alloc_mem(); + ft_putchar('\n'); + return (0); } diff --git a/malloc/myprogram b/malloc/myprogram index f11d0a53edabbefae919523cf72500c39a43babd..e3d378bfd5ecb778d6240e57d22e51eecb1bf595 100755 GIT binary patch delta 1046 zcmZ8gUr1A76#u^c@o#xIH5fVdP8@C^c|{9DEHkbw=tWa9N|xCENYjmZg&4$$Ah?0B z@!3lc(W6n+L?2oYh7~r0ivEEQK17sV!G{$Q5y3iV_uJAAJLmk)@BHrB_kH)fslLqd zL@m{l`%csK4?=P=xl>d5*ur$N3C6)?c;10yFwj( z1}NAZZM80Op@(;u*c*D6n%QMT2X(OpLme$; zFAd!^!^(}_juB8@5@ETJafA$7zZ^A19S%x7$*C2Yl1XO^JelN_jF4~;I%3&V=} z$*s;Cj|Se^Z_aPev8>T$kgC{z(>3cnAK-=|7Vy;Kf~l>Xi9%^ydM^I~hG?4*JhMG* zaAxXiif9{peE{lZ{Bu>_26k0vTY*jEB=walYrx+JoX*Q$tMX@U7G;Z;`S_cVIDnJ0^=puhoys}WkQ2BdvbCAZ<$~3SHV}!3 z-Xc1LD1!(WxU~!@G8XVnPsDsZXPpzH6$D|}?+S&d0&bu}GygcnI~Bg*E3$;$6YP8O zs&>LGbQ}91bToPRof+i$9M689BLe#-G%iY(2ZG7kWEo~A(NXVLypb7YJUA952@kqRPvBqrzwglV=ZU!#}2kXVhcJRXUpg0tgiNuK)l5 delta 600 zcmX@%yuoRL2;+>2qT!4k6LYN@SthPj7gFG7U|?imV2A-?5K!Qs_{dJM1}e$}5oD;D zY{+OY*Z~z)fr@raZe&!P{E1Oca1B((11hs-vLe%JMyAPUnT#0)CNnZiGqOyUWwvHC zm>kJ$t*8N1<)Og9U;w0E8-RRPApHVJdraQSEYHY1S&&tl^#YL3HZf3mG6#!> zK%Q}ayU0}Q-|KA`KL0Vz;lN}E77Zo^{>fP^ZGsg*g&aTwG=W$Eh#NLDvg&hgR$z5t zoNU0yUN5kN3n=yd(?!Vtt~M(`Cue4w{r@`6AnSRo&f zVR*o!`G`R5;s2_AK;D1V2|&`PSGE#JIR^h%%>>dDGJpib%V+=p|IYww(Pwyh2gn2k zwG2oC2#{$|Fo2@M1W1E$?c}@s#uF1bIA=gZcF|@-f%E*66<8%$1eFAWCbK9gD&{8U zsize < sizeof(t_header) + size) + while (*node && (size_t)(*node)->size < sizeof(t_node) + size) node = &(*node)->next; return (node); } @@ -18,34 +18,57 @@ void add_chunk(t_node **node_ref, size_t size) node_ref = &(*node_ref)->next; *node_ref = mmap(NULL, malloc_N, PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, -1, 0); - (*node_ref)->size = (TINY(size) ? malloc_N : malloc_M) + sizeof(t_node); + (*node_ref)->size = TINY(size) ? malloc_N : malloc_M; (*node_ref)->next = NULL; } -void *split_node(t_node **node, size_t size) +void mem_insert(t_node **head, t_node *new) { - t_header *hptr; + while (*head) + { + if (new < *head) + { + new->next = *head; + *head = new; + return ; + } + head = &(*head)->next; + } + *head = new; +} + +void *split_node(t_node **free, t_node **alloc, size_t size) +{ + t_node *new_alloc; int free_size; - free_size = (*node)->size; - hptr = *(t_header**)node; - *node = *node + size + sizeof(*hptr); - (*node)->size = free_size - size - sizeof(*hptr); - hptr->size = size; - hptr->magic = malloc_magic; - return (hptr + sizeof(*hptr)); + free_size = (*free)->size; + /* printf("split now size=[%zu]\n", size); */ + /* printf("free @ [%p], size=[%i]\n", *free, (*free)->size); */ + /* printf("size + sizeof = [%lu]\n", size + HEADER_SIZE); */ + /* printf("alloc @ [%p]\n", *alloc); */ + /* fflush(stdout); */ + new_alloc = *free; + *(void**)free += 8 * (size + HEADER_SIZE); + (*free)->size = free_size - (size + HEADER_SIZE); + new_alloc->size = size; + mem_insert(alloc, new_alloc); + return (*alloc + HEADER_SIZE); } void *malloc(size_t size) { t_node **zone_ref; + t_node **alloc_ref; t_node **node_ref; void *ptr; - printf("malloc(%zu) was called\n", size); + printf("malloc(%zu) was called. [%lu] bytes\n", size, malloc_bytes(size)); + size = malloc_bytes(size); zone_ref = TINY(size) ? &tiny_zone : &small_zone; - while (!(*(node_ref = find_node(zone_ref, size)))) + alloc_ref = TINY(size) ? &tiny_alloc : &small_alloc; + while (!*(node_ref = find_node(zone_ref, size))) add_chunk(node_ref, size); - ptr = split_node(node_ref, size); + ptr = split_node(node_ref, alloc_ref, size); return (ptr); } diff --git a/malloc/src/show_alloc_mem.c b/malloc/src/show_alloc_mem.c index 94cbd062..c160db0f 100644 --- a/malloc/src/show_alloc_mem.c +++ b/malloc/src/show_alloc_mem.c @@ -2,16 +2,40 @@ t_node *tiny_zone; t_node *small_zone; +t_node *tiny_alloc; +t_node *small_alloc; -int show_free_zone(t_node *node) +void print_free_mem(t_node *node) +{ + size_t size; + void *addr; + + size = node->size; + addr = (void*)node; + printf("\t%p - %p : %4zu byte%c\n", + addr, addr + 8 * size, size, size > 1 ? 's' : 0); +} + +void print_alloc_mem(t_node *node) +{ + size_t size; + void *addr; + + size = node->size; + addr = (void*)node + HEADER_SIZE; + printf("\t%p - %p : %4zu(+%zu) byte%c\n", + addr, addr + 8 * size, size, HEADER_SIZE, size > 1 ? 's' : 0); +} + +int show_zone(t_node *node, int is_free) { int total; total = 0; while (node) { - printf("%p - %p: %i bytes\n", node, node + node->size, node->size); - total += node->size; + is_free ? print_free_mem(node) : print_alloc_mem(node); + total += node->size + HEADER_SIZE; node = node->next; } return (total); @@ -19,12 +43,27 @@ int show_free_zone(t_node *node) void show_alloc_mem(void) { - int total; + size_t free_total; + size_t alloc_total; - total = 0; - ft_putstr("TINY:\n"); - total += show_free_zone(tiny_zone); - ft_putstr("SMALL:\n"); - total += show_free_zone(small_zone); - printf("Total: %i bytes\n", total); + free_total = 0; + alloc_total = 0; + if (tiny_alloc) + ft_putstr("TINY:"); + ft_putstr(FG_RED); + alloc_total += show_zone(tiny_alloc, 0); + ft_putstr(FG_GREEN); + free_total += show_zone(tiny_zone, 1); + ft_putstr(FG_DEFAULT); + if (small_alloc) + ft_putstr("SMALL:"); + ft_putstr(FG_RED); + alloc_total += show_zone(small_alloc, 0); + ft_putstr(FG_GREEN); + free_total += show_zone(small_zone, 1); + ft_putstr(FG_DEFAULT); + printf("Total:"); + printf("\t%7zu bytes allocated\n", alloc_total); + printf("\t%7zu bytes free\n", free_total); + printf("\t%7zu bytes mapped\n", alloc_total + free_total); }