#include <stdio.h>
#include "mmprivate.h"
static void tr_break PARAMS ((void));
static void tr_freehook PARAMS ((PTR, PTR));
static PTR tr_mallochook PARAMS ((PTR, size_t));
static PTR tr_reallochook PARAMS ((PTR, PTR, size_t));
#ifndef __GNU_LIBRARY__
extern char *getenv ();
#endif
static FILE *mallstream;
#if 0
static char mallenv[] = "MALLOC_TRACE";
static char mallbuf[BUFSIZ];
#endif
static PTR mallwatch;
static void (*old_mfree_hook) PARAMS ((PTR, PTR));
static PTR (*old_mmalloc_hook) PARAMS ((PTR, size_t));
static PTR (*old_mrealloc_hook) PARAMS ((PTR, PTR, size_t));
static void
tr_break ()
{
}
static void
tr_freehook (md, ptr)
PTR md;
PTR ptr;
{
struct mdesc *mdp;
mdp = MD_TO_MDP (md);
fprintf (mallstream, "- %08lx\n", (unsigned long) ptr);
if (ptr == mallwatch)
tr_break ();
mdp -> mfree_hook = old_mfree_hook;
mfree (md, ptr);
mdp -> mfree_hook = tr_freehook;
}
static PTR
tr_mallochook (md, size)
PTR md;
size_t size;
{
PTR hdr;
struct mdesc *mdp;
mdp = MD_TO_MDP (md);
mdp -> mmalloc_hook = old_mmalloc_hook;
hdr = (PTR) mmalloc (md, size);
mdp -> mmalloc_hook = tr_mallochook;
fprintf (mallstream, "+ 0x%08lx 0x%lx\n",
(unsigned long) hdr, (unsigned long) size);
if (hdr == mallwatch)
tr_break ();
return (hdr);
}
static PTR
tr_reallochook (md, ptr, size)
PTR md;
PTR ptr;
size_t size;
{
PTR hdr;
struct mdesc *mdp;
mdp = MD_TO_MDP (md);
if (ptr == mallwatch)
tr_break ();
mdp -> mfree_hook = old_mfree_hook;
mdp -> mmalloc_hook = old_mmalloc_hook;
mdp -> mrealloc_hook = old_mrealloc_hook;
hdr = (PTR) mrealloc (md, ptr, size);
mdp -> mfree_hook = tr_freehook;
mdp -> mmalloc_hook = tr_mallochook;
mdp -> mrealloc_hook = tr_reallochook;
if (hdr == NULL)
fprintf (mallstream, "! 0x%08lx 0x%lx\n",
(unsigned long) ptr, (unsigned long) size);
else
fprintf (mallstream, "< 0x%08lx\n> 0x%08lx 0x%lx\n",
(unsigned long) ptr, (unsigned long) hdr, (unsigned long) size);
if (hdr == mallwatch)
tr_break ();
return hdr;
}
int
mmtrace ()
{
#if 0
char *mallfile;
mallfile = getenv (mallenv);
if (mallfile != NULL || mallwatch != NULL)
{
mallstream = fopen (mallfile != NULL ? mallfile : "/dev/null", "w");
if (mallstream != NULL)
{
setbuf (mallstream, mallbuf);
fprintf (mallstream, "= Start\n");
old_mfree_hook = mdp -> mfree_hook;
mdp -> mfree_hook = tr_freehook;
old_mmalloc_hook = mdp -> mmalloc_hook;
mdp -> mmalloc_hook = tr_mallochook;
old_mrealloc_hook = mdp -> mrealloc_hook;
mdp -> mrealloc_hook = tr_reallochook;
}
}
#endif
return (1);
}