VS2008 project files.
[xiph/unicode.git] / w3d / mem.c
blobc2cf18c0beca4c249c22ab4d61d5745d68ed6946
1 /*
2 * Debugging implementation of MALLOC and friends
3 */
6 #include "mem.h"
8 #if defined(DBG_MEMLEAKS)
10 typedef struct {
11 void *mem;
12 char *allocated_in_func;
13 char *allocated_in_file;
14 unsigned int allocated_in_line;
15 } MemDesc;
18 static int initialized = 0;
19 static int alloc_count = 0;
20 static MemDesc *alloc_list = NULL;
23 static
24 void dbg_memleaks_done (int exitcode, void *dummy)
26 unsigned int i;
27 (void) dummy;
29 if (exitcode == 0 && alloc_count != 0) {
30 fprintf (stderr, "\nmemory leak detected !!!\n");
31 fprintf (stderr, "\nalloc_count == %i\n\n", alloc_count);
32 for (i=0; i<alloc_count; i++) {
33 MemDesc *d = &alloc_list[i];
34 fprintf (stderr, "chunk %p allocated in %s (%s: %u) not free'd !!\n",
35 d->mem, d->allocated_in_func, d->allocated_in_file,
36 d->allocated_in_line);
38 free(alloc_list);
40 fprintf (stderr, "\n");
44 static
45 void dbg_memleaks_init (void)
47 on_exit (dbg_memleaks_done, NULL);
48 initialized = 1;
52 void* dbg_malloc (char* file, int line, char *func, size_t bytes)
54 void *mem = (void*) malloc (bytes);
55 MemDesc *d;
57 if (!initialized)
58 dbg_memleaks_init();
60 alloc_count++;
61 alloc_list = realloc (alloc_list, alloc_count * sizeof(MemDesc));
63 d = &alloc_list[alloc_count-1];
64 d->mem = mem;
65 d->allocated_in_func = func;
66 d->allocated_in_file = file;
67 d->allocated_in_line = line;
69 return mem;
73 void* dbg_calloc (char* file, int line, char *func, size_t count, size_t bytes)
75 void *mem = (void*) calloc (count, bytes);
76 MemDesc *d;
78 if (!initialized)
79 dbg_memleaks_init();
81 alloc_count++;
82 alloc_list = realloc (alloc_list, alloc_count * sizeof(MemDesc));
84 d = &alloc_list[alloc_count-1];
85 d->mem = mem;
86 d->allocated_in_func = func;
87 d->allocated_in_file = file;
88 d->allocated_in_line = line;
90 return mem;
94 void* dbg_realloc (char *file, int line, char *func, char *what,
95 void *mem, size_t bytes)
97 unsigned int i;
99 for (i=0; i<alloc_count; i++) {
100 if (alloc_list[i].mem == mem) {
101 alloc_list[i].mem = (void*) realloc (mem, bytes);
102 return alloc_list[i].mem;
106 if (mem != NULL) {
107 fprintf (stderr,
108 "%s: trying to reallocate unknown chunk %p (%s)\n"
109 " in %s (%s: %u) !!!\n",
110 __FUNCTION__, mem, what, func, file, line);
111 exit (-1);
114 return dbg_malloc(file, line, func, bytes);
118 void dbg_free (char *file, int line, char *func, char *what, void *mem)
120 unsigned int i;
122 if (!initialized)
123 dbg_memleaks_init();
125 for (i=0; i<alloc_count; i++) {
126 if (alloc_list[i].mem == mem) {
127 free (mem);
128 alloc_count--;
129 memmove (&alloc_list[i], &alloc_list[i+1],
130 (alloc_count - i) * sizeof(MemDesc));
131 return;
135 fprintf (stderr, "%s: trying to free unknown chunk %p (%s)\n"
136 " in %s (%s: %u) !!!\n",
137 __FUNCTION__, mem, what, func, file, line);
138 exit (-1);
142 #endif