diff options
Diffstat (limited to 'src/show_alloc_mem.c')
| -rw-r--r-- | src/show_alloc_mem.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/src/show_alloc_mem.c b/src/show_alloc_mem.c new file mode 100644 index 0000000..6fd5e37 --- /dev/null +++ b/src/show_alloc_mem.c @@ -0,0 +1,87 @@ +/** + * @file show_alloc_mem.c + * @brief Print every allocated zone and block to stdout. + */ + +#include "libft.h" +#include "malloc.h" +#include "malloc_internal.h" + +static void +_s_put_ptr (void *ptr) +{ + const char hex[] = "0123456789abcdef"; + char buf[20]; + unsigned long value; + int i; + + value = (unsigned long)ptr; + i = (int)sizeof (buf); + while (value) + { + buf[--i] = hex[value % 16]; + value /= 16; + } + buf[--i] = 'x'; + buf[--i] = '0'; + ft_putstr_fd (buf + i, 1); +} + +static void +_s_put_size (size_t n) +{ + if (n >= 10) + _s_put_size (n / 10); + ft_putchar_fd ('0' + (n % 10), 1); +} + +static size_t +_s_print_zone (char *label, t_zone *zone) +{ + t_chunk *chunk; + void *start; + void *end; + size_t total; + + total = 0; + while (zone) + { + ft_putstr_fd (label, 1); + ft_putstr_fd (" : ", 1); + _s_put_ptr (zone); + ft_putchar_fd ('\n', 1); + chunk = (t_chunk *)((char *)zone + ALIGN (sizeof (t_zone))); + while (chunk) + { + if (!chunk->is_free) + { + start = (char *)chunk + ALIGN (sizeof (t_chunk)); + end = (char *)start + chunk->size; + _s_put_ptr (start); + ft_putstr_fd (" - ", 1); + _s_put_ptr (end); + ft_putstr_fd (" : ", 1); + _s_put_size (chunk->size); + ft_putendl_fd (" bytes", 1); + total += chunk->size; + } + chunk = chunk->next; + } + zone = zone->next; + } + return (total); +} + +void +show_alloc_mem (void) +{ + size_t total; + + total = 0; + total += _s_print_zone ("TINY", g_heap.tiny); + total += _s_print_zone ("SMALL", g_heap.small); + total += _s_print_zone ("LARGE", g_heap.large); + ft_putstr_fd ("Total : ", 1); + _s_put_size (total); + ft_putendl_fd (" bytes", 1); +} |
