From c395e96cd57a298e28d655723d5bfa944a2961d6 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Sat, 18 Feb 2017 20:11:41 +0100 Subject: [PATCH] colorful debug framework --- malloc/Makefile | 9 ++- malloc/includes/malloc.h | 2 +- malloc/includes/malloc_internal.h | 19 +++-- malloc/libft | 2 +- malloc/libft_malloc_x86_64_Darwin.so | Bin 8876 -> 13836 bytes malloc/main.c | 21 +++--- malloc/run.sh | 2 +- malloc/src/error_lib.c | 41 +++++++++++ malloc/src/free.c | 44 ++++++------ malloc/src/get_zones.c | 36 ++++++++++ malloc/src/malloc.c | 88 +++++++++--------------- malloc/src/node_lib.c | 83 ++++++++++++++++++++++ malloc/src/{insert_node.c => realloc.c} | 22 ++---- malloc/src/show_alloc_mem.c | 45 ++++-------- malloc/test0.c | 12 ++++ 15 files changed, 282 insertions(+), 144 deletions(-) create mode 100644 malloc/src/error_lib.c create mode 100644 malloc/src/get_zones.c create mode 100644 malloc/src/node_lib.c rename malloc/src/{insert_node.c => realloc.c} (66%) create mode 100644 malloc/test0.c diff --git a/malloc/Makefile b/malloc/Makefile index 90b545b5..8cf4f4e8 100644 --- a/malloc/Makefile +++ b/malloc/Makefile @@ -7,7 +7,7 @@ ARCH_NAME = libft_malloc_$(HOSTTYPE).so CC = gcc W_FLAGS = -Wall -Wextra -Werror -V_FLAGS = -fvisibility=hidden +V_FLAGS = D_FLAGS = FLAGS = $(W_FLAGS) $(V_FLAGS) $(D_FLAGS) @@ -22,9 +22,12 @@ INC_DIR = includes/ OBJ_DIR = objs/ SRC_BASE = \ +error_lib.c\ free.c\ -insert_node.c\ +get_zones.c\ malloc.c\ +node_lib.c\ +realloc.c\ show_alloc_mem.c SRCS = $(addprefix $(SRC_DIR), $(SRC_BASE)) @@ -85,6 +88,6 @@ relib: fcleanlib $(LIBFT_LIB) test: gcc -lft_malloc -L. -Iincludes -I$(LIBFT_INC) -o myprogram main.c -.PHONY : fclean clean re relib cleanlib fcleanlib +.PHONY : fclean clean re relib cleanlib fcleanlib $(LIBFT_LIB) -include $(OBJS:.o=.d) diff --git a/malloc/includes/malloc.h b/malloc/includes/malloc.h index 482cabbc..36128d63 100644 --- a/malloc/includes/malloc.h +++ b/malloc/includes/malloc.h @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/17 23:00:06 by jhalford #+# #+# */ -/* Updated: 2017/02/17 23:00:10 by jhalford ### ########.fr */ +/* Updated: 2017/02/18 18:53:22 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ diff --git a/malloc/includes/malloc_internal.h b/malloc/includes/malloc_internal.h index 6120b12d..f81845d1 100644 --- a/malloc/includes/malloc_internal.h +++ b/malloc/includes/malloc_internal.h @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/17 23:00:24 by jhalford #+# #+# */ -/* Updated: 2017/02/17 23:25:09 by jhalford ### ########.fr */ +/* Updated: 2017/02/18 20:06:55 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -18,13 +18,14 @@ # define malloc_N (1 * getpagesize()) # define malloc_M (2 * getpagesize()) # define malloc_magic 1234567 -# define HEADER_SIZE (sizeof(t_node)) +# define HEADER_SIZE (sizeof(t_node) - alignof(t_node)) # define TINY(x) (x < (malloc_n + 1)) # define SMALL(x) (!TINY(x) && !LARGE(x)) # define LARGE(x) (malloc_m < x) #include "libft.h" #include +#include typedef struct s_header { int size; @@ -34,6 +35,7 @@ typedef struct s_header { typedef struct s_node { int size; struct s_node *next; + char data[1]; } t_node; extern t_node *tiny_zone; @@ -50,7 +52,16 @@ void show_alloc_mem(void); # pragma GCC visibility pop -void show_free_mem(void); -void insert_node(t_node **head, t_node *new); +void get_zones(t_node ***zone_ref, t_node ***alloc_ref, size_t size); +void insert_node(t_node **head, t_node *node); +int remove_node(t_node **head, t_node *node); +t_node *split_node(t_node **node, t_node **alloc, t_node **zone, size_t size); +t_node **find_node_firstfit(t_node **node, size_t size); + +void show_free_mem(void); +void print_node(char fg[7], t_node *node); + +void error_mmap(void); +void error_free_notalloc(void *ptr); #endif diff --git a/malloc/libft b/malloc/libft index a82ea94e..0ca8ca81 160000 --- a/malloc/libft +++ b/malloc/libft @@ -1 +1 @@ -Subproject commit a82ea94ef7f50f8396d7bf6f9c08ab4a7faa994d +Subproject commit 0ca8ca817f32fc0345ef93ef74a3abe2583bd89c diff --git a/malloc/libft_malloc_x86_64_Darwin.so b/malloc/libft_malloc_x86_64_Darwin.so index 9c5adf87fd22e76f1178fb09892b0f6ded5d31de..0f30e1deef8e947ee01a727572bbc7346171f01f 100755 GIT binary patch literal 13836 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 literal 8876 zcmeHMVQgGS5#F=w;y6jqiJB^;lw4a}9I7OCiBsd$iVtrAMAdY3Mlv*v1Yi3dMtby22B9@eR>3XNNyiPe<2;x<`FToo7BB^w8 zaQLVmQ*PfCE$=D#Ua_p9@Tb|gRm*GC6NnefqbyGshgeo*Bpx3b*2CA>7u52aya9m4 z@``hiLl_6f%(A)<9Q>Bib->$W0T5A6dqE6HbOonf#j?0>TT!=`(T4{6`qNfCJTx>C zvBp~WT6_0cUEw5BX;+GQ^nehP($;`lXDuM*cqJGR;wd06Xh?IYqxODvR&0QPUjSc^ z`UENq?P6tI8QL- zzT)A4EE`a1Kj+d`U)>d?s!!}5O(l238LU0ysdOy9t8-U$92f?nJcLTQg@Bs7L*rcM zXSwv6&U>c47%-iQB{MUM3h0a$+y`OxpBV*E3#N14eGX}CI)-c77Xybc%;+NLI}?R@ zW0A`=?TLc$PcfU!d1HyB{7yFPnGs{r%!CS)kNJfE6c4bBv1rfw9Ahz`TV7t4e8+$d z#*(MOlMkC*&^~5XNmh#WQw&q#dr0lU5o6Ky@`wT#K<3A{hYnO!}NE*YdXDfQg6;~BRVJJmzi)8)13RuPnMVMC3tfaO~|(Y7kllD za9;*+jO!4BnHa_$!j2jFIuz79OU|9-xo=~-V=N#Yn!I2kCszE29FohD@#<2G1SPa& z?(_NW?M17WvFf0Y6yNdXi`kx2UT21^j?p@c^)=5<&q>$XZDKlf(|=0GU4|}#MIb5c zxq3$Hx%1P#H-Bi{eAVZl;xUuIyT~9<<7uT4x!AwUzx@sv@;p1aX*&Eij}LbnteMLp05|eH65Tq9V~gC#7&pwwCDRGH z&9lzjIerw*R$)%ZStx;Lus@uuU@tgx-I>sW`!3Xi3M&yW!-WMZA6K(+K8WO@dPcA~ z|BKh>^dehix@M|mTIkg6MVf(SpRbons_!wKd(22L@&<<3f2}un{KvVbXF63JE72VL zI4g@7yV=$B=!zq2*pzGj(A9(JAg#49x#UMn_VlC*7Z8<6!y%;!(bP^!`!%{Y9*<`SLk={>Wt` z<0AXv0c;Z{pWMa}30OT*=$2VEQSkX6zXD#)bmr+>Cv?5rnd{0J*Ws_r_@b?B*?#}_ zuA+R-)^yUFOu`Q5(x>Rf8L(D2ch;?SU+&6;s5?}mdu@EZ{lt88Lh!BpkZ=#6>*AE! zBBR%S4sz&Ri2MkLH&Zg({wj!W^M~-OoOY^RMWNu{r<`A)<1&a?^%zcnRQ5At^*qpk zBZYbP;9%yLf%^$EpQNH}OAi2aJu7t~UecC_m3-F?F_w&gC%@HnS|JT#k<#4!6(y}& zNn5X^1*NoiRx`fbA3+#!1B1*gT#>1Hg|qSf;m2{_$U!?ludap#2{SF17Q%P~7Lq{l4PTsH4hQiWMI2T{7fA); zF-1%$VgcI`#9l=lkwh$}I)rrPhJ4F0u7Te|erDrE$zO+465IGq{}et#2>iw1;R`M} zVrIGFH-O6xr)B%PY|qH{4YWdZXYU(Fr=w@NVGwX;fW-X2;QRspl*?adk73Kd%^pA2 z`Ah5>?EMM7baEVjw*u*rKz}k83-pDffp9dMjHOaS{rqigI61l_5W!F3ShP;8Ye)ok z2GFzx8upwV4fKttV-1lt^u~wfERWle68C=htIct?kFafui$ezvey2_JggUyr+eCNA zw;wm!#G#RNc&H6Z9@U~#(khByrN|%U;k2@bfCr3b#yeG zjEX0Z*Utp;NEVfk?N%S&pYb?8>EgCU7T=6GzO`&-e|T_6fF1z-Xe^xwAC093PsT`U z1c?_J>^GsG!25W*pI9rf6Uo6ehw0+8@P1g`FCI{rH{xJwVC00Q-ZA5`xabj8X-n+H zRgX9zsuH7VJhzMeXoh0LqN`fWuE)K{%clxn#7A(zKx;;xuje1$+UQRhBj?! zm$Iw9s-KaCRThep%#ragp{QIcNd}b$UIOUQuSv9IIGSwRy}M;^^PZMHj|lO9)58S* diff --git a/malloc/main.c b/malloc/main.c index 9933afc1..def26fb9 100644 --- a/malloc/main.c +++ b/malloc/main.c @@ -1,23 +1,20 @@ +#include #include "includes/malloc.h" -#include int main(void) { - void *ptr0 = malloc(8150); + void *ptr0 = malloc(4096); show_alloc_mem(); - printf("\n"); - void *ptr1 = malloc(300); + void *ptr1 = malloc(16); show_alloc_mem(); - printf("\n"); - /* free(ptr0); */ - /* show_alloc_mem(); */ - /* printf("\n"); */ - - free(ptr1); + free(ptr0); show_alloc_mem(); - printf("\n"); - return (0); + void *ptr2 = malloc(16); + show_alloc_mem(); + + void *ptr3 = malloc(32); + show_alloc_mem(); } diff --git a/malloc/run.sh b/malloc/run.sh index 19faa239..45580df0 100755 --- a/malloc/run.sh +++ b/malloc/run.sh @@ -1,5 +1,5 @@ #!/bin/sh -export DYLD_LIBRARY_PATH=. +export DYLD_LIBRARY_PATH="." export DYLD_INSERT_LIBRARIES="libft_malloc.so" export DYLD_FORCE_FLAT_NAMESPACE=1 $@ diff --git a/malloc/src/error_lib.c b/malloc/src/error_lib.c new file mode 100644 index 00000000..055c3abe --- /dev/null +++ b/malloc/src/error_lib.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* error_lib.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/18 19:34:23 by jhalford #+# #+# */ +/* Updated: 2017/02/18 20:08:32 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "malloc_internal.h" + +void error_free_notalloc(void *ptr) +{ + int fd; + + fd = 1; + ft_putstr_fd(FG_RED"(", fd); + ft_putnbr_fd(getpid(), fd); + ft_putstr_fd(", ??? ", fd); + ft_putstr_fd(")", fd); + ft_putstr_fd(" malloc: error for object ", fd); + ft_putaddr_fd(ptr, fd); + ft_putendl_fd(": pointer being freed was not allocated"FG_DEFAULT, fd); + /* exit(134); */ +} + +void error_mmap(void) +{ + int fd; + + fd = 1; + ft_putstr_fd(FG_RED"(", fd); + ft_putnbr_fd(getpid(), fd); + ft_putstr_fd(", ??? ", fd); + ft_putstr_fd(")", fd); + ft_putendl_fd(" malloc: mmap failed", fd); + /* exit(134); */ +} diff --git a/malloc/src/free.c b/malloc/src/free.c index 77f01321..c5f53356 100644 --- a/malloc/src/free.c +++ b/malloc/src/free.c @@ -6,25 +6,18 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/17 12:28:03 by jhalford #+# #+# */ -/* Updated: 2017/02/17 23:02:10 by jhalford ### ########.fr */ +/* Updated: 2017/02/18 20:10:24 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "malloc_internal.h" -int remove_node(t_node **head, t_node *node) -{ - while (*head) - { - if (*head == node) - { - *head = (*head)->next; - return (0); - } - head = &(*head)->next; - } - return (1); -} +t_node *tiny_zone; +t_node *small_zone; +t_node *large_zone; +t_node *tiny_alloc; +t_node *small_alloc; +t_node *large_alloc; int coalesce_nodes(t_node **head) { @@ -45,14 +38,21 @@ void free(void *ptr) { t_node **zone_ref; t_node **alloc_ref; - t_node *hptr; + t_node *node; - hptr = ptr - HEADER_SIZE; - zone_ref = TINY(hptr->size) ? &tiny_zone : &small_zone; - alloc_ref = TINY(hptr->size) ? &tiny_alloc : &small_alloc; - if (remove_node(alloc_ref, hptr)) - printf("trying to free bad address"); - insert_node(zone_ref, hptr); - hptr->size += HEADER_SIZE; + ft_putstr(FG_YELLOW"free("); + ft_putaddr(ptr); + ft_putendl(")"FG_DEFAULT); + if (!ptr) + return ; + node = ptr - HEADER_SIZE; + get_zones(&zone_ref, &alloc_ref, node->size); + if (remove_node(alloc_ref, node)) + { + error_free_notalloc(ptr); + return ; + } + insert_node(zone_ref, node); coalesce_nodes(zone_ref); + ft_putendl(BG_GREEN"SUCCESSFUL FREE"BG_DEFAULT); } diff --git a/malloc/src/get_zones.c b/malloc/src/get_zones.c new file mode 100644 index 00000000..52c1f65c --- /dev/null +++ b/malloc/src/get_zones.c @@ -0,0 +1,36 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* get_zones.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/18 17:53:41 by jhalford #+# #+# */ +/* Updated: 2017/02/18 20:06:53 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "malloc_internal.h" + +t_node *tiny_zone = NULL; +t_node *small_zone = NULL; +t_node *large_zone = NULL; +t_node *tiny_alloc = NULL; +t_node *small_alloc = NULL; +t_node *large_alloc = NULL; + +void get_zones(t_node ***zone_ref, t_node ***alloc_ref, size_t size) +{ + if (LARGE(size)) + { + *zone_ref = &large_zone; + *alloc_ref = &large_alloc; + } + else + { + *zone_ref = TINY(size) ? &tiny_zone : &small_zone; + *alloc_ref = TINY(size) ? &tiny_alloc : &small_alloc; + } + ft_putstr("zone @"); + **zone_ref ? print_node(BG_MAGENTA, **zone_ref) : ft_putendl(" NULL"); +} diff --git a/malloc/src/malloc.c b/malloc/src/malloc.c index bdde52c4..93ad0b58 100644 --- a/malloc/src/malloc.c +++ b/malloc/src/malloc.c @@ -6,76 +6,56 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/17 12:28:02 by jhalford #+# #+# */ -/* Updated: 2017/02/17 23:02:14 by jhalford ### ########.fr */ +/* Updated: 2017/02/18 20:08:49 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "malloc_internal.h" -t_node *tiny_zone = NULL; -t_node *small_zone = NULL; -t_node *large_zone = NULL; -t_node *tiny_alloc = NULL; -t_node *small_alloc = NULL; -t_node *large_alloc = NULL; +t_node *tiny_zone; +t_node *small_zone; +t_node *large_zone; +t_node *tiny_alloc; +t_node *small_alloc; +t_node *large_alloc; -t_node **find_node(t_node **node, size_t size) -{ - while (*node && (size_t)(*node)->size < size + HEADER_SIZE) - node = &(*node)->next; - return (node); -} - -void add_chunk(t_node **node_ref, size_t size) +void add_chunk(t_node **zone_ref, size_t size) { size_t chunk_size; + t_node *node; - while (*node_ref) - node_ref = &(*node_ref)->next; + /* while (*node_ref) */ + /* node_ref = &(*node_ref)->next; */ if (LARGE(size)) chunk_size = size + HEADER_SIZE; else chunk_size = TINY(size) ? malloc_N : malloc_M; - *node_ref = mmap(NULL, chunk_size, PROT_READ|PROT_WRITE, - MAP_ANON|MAP_PRIVATE, -1, 0); - (*node_ref)->size = chunk_size; - (*node_ref)->next = NULL; -} - -void *split_node(t_node **free, t_node **alloc, size_t size) -{ - t_node *new_alloc; - int free_size; - - free_size = (*free)->size; - new_alloc = *free; - *(void**)free += (size + HEADER_SIZE); - (*free)->size = free_size - (size + HEADER_SIZE); - new_alloc->size = size; - insert_node(alloc, new_alloc); - return ((void*)new_alloc + HEADER_SIZE); + if (!(node = mmap(NULL, chunk_size, PROT_READ|PROT_WRITE, + MAP_ANON|MAP_PRIVATE, -1, 0))) + error_mmap(); + ft_putstr("nchunk@"); + node->size = chunk_size; + insert_node(zone_ref, node); + print_node(BG_GREEN, node); } void *malloc(size_t size) { - t_node **zone_ref; - t_node **alloc_ref; - t_node **node_ref; - void *ptr; + t_node **zone_ref; + t_node **alloc_ref; + t_node **node_ref; + t_node *node; - printf("malloc(%zu) called\n", size); - if (LARGE(size)) - { - zone_ref = &large_zone; - alloc_ref = &large_alloc; - } - else - { - zone_ref = TINY(size) ? &tiny_zone : &small_zone; - 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, alloc_ref, size); - return (ptr); + ft_putstr(FG_YELLOW"malloc("); + ft_putnbr(size); + ft_putendl(")"FG_DEFAULT); + get_zones(&zone_ref, &alloc_ref, size); + while (!*(node_ref = find_node_firstfit(zone_ref, size))) + add_chunk(zone_ref, size); + ft_putstr("found @"); + print_node(FG_GREEN, *node_ref); + node = split_node(node_ref, alloc_ref, zone_ref, size); + ft_putstr("touser@"); + print_node(FG_RED, node); + return (node->data); } diff --git a/malloc/src/node_lib.c b/malloc/src/node_lib.c new file mode 100644 index 00000000..f1fe4216 --- /dev/null +++ b/malloc/src/node_lib.c @@ -0,0 +1,83 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* insert_node.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: jhalford +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2017/02/17 12:28:15 by jhalford #+# #+# */ +/* Updated: 2017/02/18 20:08:46 by jhalford ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "malloc_internal.h" + +t_node **find_node_firstfit(t_node **node, size_t size) +{ + /* if (*node) */ + /* { */ + /* ft_putstr("startf@"); */ + /* print_node(BG_CYAN, *node); */ + /* } */ + while (*node && (size_t)(*node)->size < size + HEADER_SIZE) + { + node = &(*node)->next; + /* ft_putstr("firstf@"); */ + /* print_node(FG_GREEN, *node); */ + } + return (node); +} + +t_node *split_node(t_node **node, t_node **alloc, t_node **zone, size_t size) +{ + t_node *new_alloc; + int free_size; + + free_size = (*node)->size; + new_alloc = *node; + /* ft_putstr("node->data @ ["); */ + /* ft_putaddr((*node)->data); */ + /* ft_putendl("]"); */ + *node = (t_node*)((*node)->data + size); + /* ft_putstr("node @ ["); */ + /* ft_putaddr(*node); */ + /* ft_putendl("]"); */ + (*node)->size = free_size - (size + HEADER_SIZE); + if ((*node)->size == 0) + remove_node(zone, *node); + new_alloc->size = size; + insert_node(alloc, new_alloc); + return (new_alloc); +} + + +int remove_node(t_node **head, t_node *node) +{ + while (*head) + { + ft_putstr("looking for node; diff=["); + ft_putaddr(node); + ft_putstr(","); + ft_putaddr(*head); + ft_putendl("]"); + if (*head == node) + { + *head = (*head)->next; + return (0); + } + head = &(*head)->next; + } + return (1); +} + +void insert_node(t_node **head, t_node *new) +{ + while (*head) + { + if (new < *head) + break ; + head = &(*head)->next; + } + new->next = *head; + *head = new; +} diff --git a/malloc/src/insert_node.c b/malloc/src/realloc.c similarity index 66% rename from malloc/src/insert_node.c rename to malloc/src/realloc.c index ddbb1104..ffd0a757 100644 --- a/malloc/src/insert_node.c +++ b/malloc/src/realloc.c @@ -1,28 +1,20 @@ /* ************************************************************************** */ /* */ /* ::: :::::::: */ -/* insert_node.c :+: :+: :+: */ +/* realloc.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ -/* Created: 2017/02/17 12:28:15 by jhalford #+# #+# */ -/* Updated: 2017/02/17 23:02:17 by jhalford ### ########.fr */ +/* Created: 2017/02/18 13:23:20 by jhalford #+# #+# */ +/* Updated: 2017/02/18 18:08:11 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ #include "malloc_internal.h" -void insert_node(t_node **head, t_node *new) +void *realloc(void *ptr, size_t size) { - while (*head) - { - if (new < *head) - { - new->next = *head; - *head = new; - return ; - } - head = &(*head)->next; - } - *head = new; + ft_putendl("realloc called"); + free(ptr); + return (malloc(size)); } diff --git a/malloc/src/show_alloc_mem.c b/malloc/src/show_alloc_mem.c index 2a21ce08..ec7797e8 100644 --- a/malloc/src/show_alloc_mem.c +++ b/malloc/src/show_alloc_mem.c @@ -6,7 +6,7 @@ /* By: jhalford +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2017/02/17 12:28:20 by jhalford #+# #+# */ -/* Updated: 2017/02/17 23:13:52 by jhalford ### ########.fr */ +/* Updated: 2017/02/18 19:58:20 by jhalford ### ########.fr */ /* */ /* ************************************************************************** */ @@ -19,49 +19,34 @@ t_node *tiny_alloc; t_node *small_alloc; t_node *large_alloc; -void print_free_mem(t_node *node) +void print_node(char color[7], t_node *node) { - size_t size; - void *addr; - - size = node->size; - addr = (void*)node; - printf("\t%p - %p : %4zu byte%c\n", - addr, (void*)addr + 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, (void*)addr + size, size, HEADER_SIZE, size > 1 ? 's' : 0); + ft_putstr("\t"); + ft_putstr(color); + ft_putaddr(node->data); + ft_putstr(" - "); + ft_putaddr(node->data + node->size); + ft_putstr(FBG_DEFAULT" : "); + ft_putnbr(node->size); + ft_putendl(" bytes"); } void show_alloc_zone(char *name, t_node *alloc, t_node *zone, size_t (*total)[3]) { if (alloc || zone) - printf("%s", name); - /* printf("%s", FG_RED); */ - ft_putstr(FG_RED); + ft_putstr(name); while (alloc) { - print_alloc_mem(alloc); + print_node(FG_RED, alloc); (*total)[1] += alloc->size; - (*total)[2] += HEADER_SIZE; alloc = alloc->next; } - printf("%s", FG_GREEN); while (zone) { - print_free_mem(zone); + print_node(FG_GREEN, zone); (*total)[0] += zone->size; zone = zone->next; } - printf("%s", FG_DEFAULT); } void show_alloc_mem(void) @@ -70,13 +55,11 @@ void show_alloc_mem(void) total[0] = 0; total[1] = 0; - total[2] = 0; show_alloc_zone("TINY:", tiny_alloc, tiny_zone, &total); show_alloc_zone("SMALL:", small_alloc, small_zone, &total); show_alloc_zone("LARGE:", large_alloc, large_zone, &total); printf("Total:"); printf("\t%7zu bytes free\n", total[0]); printf("\t%7zu bytes allocated\n", total[1]); - printf("\t%7zu header bytes\n", total[2]); - printf("\t%7zu bytes mmap'd\n", total[0] + total[1] + total[2]); + printf("\t%7zu bytes mmap'd\n", total[0] + total[1]); } diff --git a/malloc/test0.c b/malloc/test0.c new file mode 100644 index 00000000..b5830dce --- /dev/null +++ b/malloc/test0.c @@ -0,0 +1,12 @@ +#include "includes/malloc.h" + +int main(void) +{ + int i; + char *addr; + + i = 0; + while (i < 1024) + i++; + return (0); +}