]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - gui/malloc_debug.c
* Finalizo carga de articulos.
[z.facultad/75.06/emufs.git] / gui / malloc_debug.c
1 /***************************************************************************
2  *            malloc_debug.c
3  *
4  *  Sat Aug 30 17:00:48 2003
5  *  Copyright  2003  Ricardo Markiewicz
6  *  rmarkie@fi.uba.ar
7  ****************************************************************************/
8 /*
9  *  This program is free software; you can redistribute it and/or modify
10  *  it under the terms of the GNU General Public License as published by
11  *  the Free Software Foundation; either version 2 of the License, or
12  *  (at your option) any later version.
13  *
14  *  This program is distributed in the hope that it will be useful,
15  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  *  GNU Library General Public License for more details.
18  *
19  *  You should have received a copy of the GNU General Public License
20  *  along with this program; if not, write to the Free Software
21  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22  */
23
24 #include <stdlib.h>
25 #include <string.h>
26 #include <time.h>
27 /* este debe ser el ultimo include, para evitar errores de compilacion */
28 #include "malloc_debug.h"
29
30 /* Tengo que sacar los macros dentro de malloc_debug para evitar problemas */
31 #undef malloc
32 #undef free
33
34 typedef struct _t_malloc_ {
35         void *ptr;
36         int size;
37         char file[21];
38         int line;
39         time_t hora;
40         struct _t_malloc_ *next;
41 } t_MDAlloc;
42
43 static t_MDAlloc *lstMalloc = NULL;
44
45 void *MD_malloc(int size, int line, char *file)
46 {
47         void *ptr;
48         t_MDAlloc *nodo;
49
50         ptr = malloc(size);
51         if (ptr == NULL) {
52                 /* No registro nada porque no hay memoria! */
53                 return NULL;
54         }
55
56         nodo = (t_MDAlloc *)malloc(sizeof(t_MDAlloc));
57         if (nodo == NULL) {
58                 free(ptr);
59                 return NULL;
60         }
61         nodo->ptr = ptr;
62         nodo->size = size;
63         nodo->line = line;
64         nodo->hora = time(NULL);
65         strncpy(nodo->file, file, 20);
66
67         /* Agrego el nodo al principio */
68         nodo->next = lstMalloc;
69         lstMalloc = nodo;
70
71         return ptr;
72 }
73
74 void MD_free(void *ptr)
75 {
76         /* Tengo que buscar el nodo alocado */
77         t_MDAlloc *node, *padre;
78         node = lstMalloc;
79         padre = NULL;
80         while (node != NULL) {
81                 if (node->ptr == ptr) {
82                         /* lo encontre! */
83                         if (padre != NULL) {
84                                 padre->next = node->next;
85                         } else {
86                                 lstMalloc = node->next;
87                         }
88                         free(node);
89                         break;
90                 }
91                 padre = node;
92                 node = node->next;
93         }
94         free(ptr);
95 }
96
97 void MD_Listar()
98 {
99         struct tm *hora;
100         t_MDAlloc *nodo;
101         nodo = lstMalloc;
102         printf("+----------+--------+-%-20s-+---------+-------+----------+\n", "--------------------");
103         printf("|Direccion | TamaƱo | %-20s | Linea   | Fecha |   Hora   |\n", "Archivo");
104         printf("+----------+--------+-%-20s-+---------+-------+----------+\n", "--------------------");
105         while (nodo != NULL) {
106                 hora = localtime(&nodo->hora);
107                 printf("|%p | % 6d | %-20s | % 7d | %02d/%02d | %02d:%02d:%02d |\n", \
108                         nodo->ptr, nodo->size, nodo->file, nodo->line, hora->tm_mday, hora->tm_mon, \
109                         hora->tm_hour, hora->tm_min, hora->tm_sec);
110                 printf("+----------+--------+-%-20s-+---------+-------+----------+\n", "--------------------");
111                 free(hora);
112                 nodo = nodo->next;
113         }
114 }