2 * Debugging implementation of MALLOC and friends
8 #if defined(DBG_MEMLEAKS)
12 char *allocated_in_func
;
13 char *allocated_in_file
;
14 unsigned int allocated_in_line
;
18 static int initialized
= 0;
19 static int alloc_count
= 0;
20 static MemDesc
*alloc_list
= NULL
;
24 void dbg_memleaks_done (int exitcode
, 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
);
40 fprintf (stderr
, "\n");
45 void dbg_memleaks_init (void)
47 on_exit (dbg_memleaks_done
, NULL
);
52 void* dbg_malloc (char* file
, int line
, char *func
, size_t bytes
)
54 void *mem
= (void*) malloc (bytes
);
61 alloc_list
= realloc (alloc_list
, alloc_count
* sizeof(MemDesc
));
63 d
= &alloc_list
[alloc_count
-1];
65 d
->allocated_in_func
= func
;
66 d
->allocated_in_file
= file
;
67 d
->allocated_in_line
= line
;
73 void* dbg_calloc (char* file
, int line
, char *func
, size_t count
, size_t bytes
)
75 void *mem
= (void*) calloc (count
, bytes
);
82 alloc_list
= realloc (alloc_list
, alloc_count
* sizeof(MemDesc
));
84 d
= &alloc_list
[alloc_count
-1];
86 d
->allocated_in_func
= func
;
87 d
->allocated_in_file
= file
;
88 d
->allocated_in_line
= line
;
94 void* dbg_realloc (char *file
, int line
, char *func
, char *what
,
95 void *mem
, size_t bytes
)
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
;
108 "%s: trying to reallocate unknown chunk %p (%s)\n"
109 " in %s (%s: %u) !!!\n",
110 __FUNCTION__
, mem
, what
, func
, file
, line
);
114 return dbg_malloc(file
, line
, func
, bytes
);
118 void dbg_free (char *file
, int line
, char *func
, char *what
, void *mem
)
125 for (i
=0; i
<alloc_count
; i
++) {
126 if (alloc_list
[i
].mem
== mem
) {
129 memmove (&alloc_list
[i
], &alloc_list
[i
+1],
130 (alloc_count
- i
) * sizeof(MemDesc
));
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
);