00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <stdio.h>
00029 #include "mmprivate.h"
00030
00031 #ifndef __GNU_LIBRARY__
00032 extern char *getenv ();
00033 #endif
00034
00035 #if 0
00036 static FILE *mallstream;
00037 #endif
00038
00039 #if 0
00040 static char mallenv[] = "MALLOC_TRACE";
00041 static char mallbuf[BUFSIZ];
00042 #endif
00043
00044
00045 #if 0
00046 static PTR mallwatch;
00047 #endif
00048
00049
00050
00051 #if 0
00052 static void (*old_mfree_hook) PARAMS ((PTR, PTR));
00053 static PTR (*old_mmalloc_hook) PARAMS ((PTR, size_t));
00054 static PTR (*old_mrealloc_hook) PARAMS ((PTR, PTR, size_t));
00055 #endif
00056
00057 typedef void (*mmfree_fun_t) PARAMS ((PTR, PTR));
00058 typedef PTR (*mmalloc_fun_t) PARAMS ((PTR, size_t));
00059 typedef PTR (*mmrealloc_fun_t) PARAMS ((PTR, PTR, size_t));
00060
00061
00062
00063
00064
00065
00066 #if 0
00067 static void
00068 tr_break ()
00069 {
00070 }
00071
00072 static void
00073 tr_freehook (md, ptr)
00074 PTR md;
00075 PTR ptr;
00076 {
00077 struct mdesc *mdp;
00078
00079 mdp = MD_TO_MDP (md);
00080
00081 fprintf (mallstream, "- %08lx\n", (unsigned long) ptr);
00082 if (ptr == mallwatch)
00083 tr_break ();
00084 mdp -> mfree_hook = (mmfree_fun_t) old_mfree_hook;
00085 mfree (md, ptr);
00086 mdp -> mfree_hook = (mmfree_fun_t) tr_freehook;
00087 }
00088
00089 static PTR
00090 tr_mallochook (md, size)
00091 PTR md;
00092 size_t size;
00093 {
00094 PTR hdr;
00095 struct mdesc *mdp;
00096
00097 mdp = MD_TO_MDP (md);
00098 mdp -> mmalloc_hook = (mmalloc_fun_t) old_mmalloc_hook;
00099 hdr = (PTR) mmalloc (md, size);
00100 mdp -> mmalloc_hook = (mmalloc_fun_t) tr_mallochook;
00101
00102
00103 fprintf (mallstream, "+ %08lx %x\n", (unsigned long) hdr, (unsigned) size);
00104
00105 if (hdr == mallwatch)
00106 tr_break ();
00107
00108 return (hdr);
00109 }
00110
00111 static PTR
00112 tr_reallochook (md, ptr, size)
00113 PTR md;
00114 PTR ptr;
00115 size_t size;
00116 {
00117 PTR hdr;
00118 struct mdesc *mdp;
00119
00120 mdp = MD_TO_MDP (md);
00121
00122 if (ptr == mallwatch)
00123 tr_break ();
00124
00125 mdp -> mfree_hook = (mmfree_fun_t) old_mfree_hook;
00126 mdp -> mmalloc_hook = (mmalloc_fun_t) old_mmalloc_hook;
00127 mdp -> mrealloc_hook = (mmrealloc_fun_t) old_mrealloc_hook;
00128 hdr = (PTR) mrealloc (md, ptr, size);
00129 mdp -> mfree_hook = (mmfree_fun_t) tr_freehook;
00130 mdp -> mmalloc_hook = (mmalloc_fun_t) tr_mallochook;
00131 mdp -> mrealloc_hook = (mmrealloc_fun_t) tr_reallochook;
00132 if (hdr == NULL)
00133
00134 fprintf (mallstream, "! %08lx %x\n", (unsigned long) ptr, (unsigned) size);
00135 else
00136 fprintf (mallstream, "< %08lx\n> %08lx %x\n", (unsigned long) ptr,
00137 (unsigned long) hdr, (unsigned) size);
00138
00139 if (hdr == mallwatch)
00140 tr_break ();
00141
00142 return hdr;
00143 }
00144 #endif
00145
00146
00147
00148
00149
00150
00151 int
00152 mmtrace ()
00153 {
00154 #if 0
00155
00156
00157 char *mallfile;
00158
00159 mallfile = getenv (mallenv);
00160 if (mallfile != NULL || mallwatch != NULL)
00161 {
00162 mallstream = fopen (mallfile != NULL ? mallfile : "/dev/null", "w");
00163 if (mallstream != NULL)
00164 {
00165
00166 setbuf (mallstream, mallbuf);
00167 fprintf (mallstream, "= Start\n");
00168 old_mfree_hook = mdp -> mfree_hook;
00169 mdp -> mfree_hook = (mmfree_fun_t) tr_freehook;
00170 old_mmalloc_hook = mdp -> mmalloc_hook;
00171 mdp -> mmalloc_hook = (mmalloc_fun_t) tr_mallochook;
00172 old_mrealloc_hook = mdp -> mrealloc_hook;
00173 mdp -> mrealloc_hook = (mmrealloc_fun_t) tr_reallochook;
00174 }
00175 }
00176
00177 #endif
00178
00179 return (1);
00180 }