X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/e4443b735dd1c64853d863da06b62a10bb8c73f2..7aadb1a2e7f4a8401693035a8d58d6dd4b670063:/lunaix-os/tests/shared/memchk.c diff --git a/lunaix-os/tests/shared/memchk.c b/lunaix-os/tests/shared/memchk.c new file mode 100644 index 0000000..b695201 --- /dev/null +++ b/lunaix-os/tests/shared/memchk.c @@ -0,0 +1,72 @@ +#include +#include + +#include + +extern void *malloc(size_t); +extern void *calloc(size_t, size_t); +extern void free(void*); + +struct valloc_stats valloc_stat = { }; +static DEFINE_LLIST(records); + +struct addr_record { + struct llist_header link; + unsigned long addr; + unsigned long size; +}; + +void +memchk_log_alloc(unsigned long addr, unsigned long size) +{ + valloc_stat.alloced += size; + valloc_stat.nr_valloc_calls++; + + struct addr_record *record; + + record = malloc(sizeof(struct addr_record)); + record->addr = addr; + record->size = size; + + llist_append(&records, &record->link); +} + +void +memchk_log_free(unsigned long addr) +{ + valloc_stat.nr_vfree_calls++; + + struct addr_record *pos, *n; + llist_for_each(pos, n, &records, link) + { + if (pos->addr == addr) { + valloc_stat.freed += pos->size; + llist_delete(&pos->link); + + free(pos); + return; + } + } + + printf("[\x1b[33;49mWARN\x1b[0m] freeing undefined pointer: 0x%lx\n", addr); +} + + +void +memchk_print_stats() +{ + long leaked; + + leaked = valloc_stat.alloced - valloc_stat.freed; + printf("valloc() statistics:\n"); + printf(" allocated: %lu bytes\n", valloc_stat.alloced); + printf(" freed: %lu bytes\n", valloc_stat.freed); + printf(" leaked: %lu bytes\n", leaked); + printf(" vfree_call: %u times\n", valloc_stat.nr_vfree_calls); + printf(" valloc_call: %u times\n", valloc_stat.nr_valloc_calls); + + if (leaked) + { + printf("[\x1b[33;49mWARN\x1b[0m] memory leakage detected\n"); + } +} \ No newline at end of file