Unifying External Interrupt System (#51)
[lunaix-os.git] / lunaix-os / tests / shared / memchk.c
1 #include <testing/memchk.h>
2 #include <stdio.h>
3
4 #include <lunaix/ds/llist.h>
5
6 extern void *malloc(size_t);
7 extern void *calloc(size_t, size_t);
8 extern void free(void*);
9
10 struct valloc_stats valloc_stat = { };
11 static DEFINE_LLIST(records);
12
13 struct addr_record {
14     struct llist_header link;
15     unsigned long addr;
16     unsigned long size;
17 };
18
19 void
20 memchk_log_alloc(unsigned long addr, unsigned long size)
21 {
22     valloc_stat.alloced += size;
23     valloc_stat.nr_valloc_calls++;
24
25     struct addr_record *record;
26
27     record = malloc(sizeof(struct addr_record));
28     record->addr = addr;
29     record->size = size;
30
31     llist_append(&records, &record->link);
32 }
33
34 void
35 memchk_log_free(unsigned long addr)
36 {
37     valloc_stat.nr_vfree_calls++;
38
39     struct addr_record *pos, *n;
40     llist_for_each(pos, n, &records, link)
41     {
42         if (pos->addr == addr) {
43             valloc_stat.freed += pos->size;
44             llist_delete(&pos->link);
45
46             free(pos);
47             return;
48         }
49     }
50
51     printf("[\x1b[33;49mWARN\x1b[0m] freeing undefined pointer: 0x%lx\n", addr);
52 }
53
54
55 void
56 memchk_print_stats()
57 {
58     long leaked;
59
60     leaked = valloc_stat.alloced - valloc_stat.freed;
61     printf("valloc() statistics:\n");
62     printf("  allocated:   %lu bytes\n", valloc_stat.alloced);
63     printf("  freed:       %lu bytes\n", valloc_stat.freed);
64     printf("  leaked:      %lu bytes\n", leaked);
65     printf("  vfree_call:  %u  times\n", valloc_stat.nr_vfree_calls);
66     printf("  valloc_call: %u  times\n", valloc_stat.nr_valloc_calls);
67
68     if (leaked)
69     {
70         printf("[\x1b[33;49mWARN\x1b[0m] memory leakage detected\n");
71     }
72 }