diff --git a/tools/trace-malloc/spacetrace.c b/tools/trace-malloc/spacetrace.c index cb3d578c4b3..e3a6586a88b 100644 --- a/tools/trace-malloc/spacetrace.c +++ b/tools/trace-malloc/spacetrace.c @@ -245,6 +245,26 @@ int showHelp(void) return retval; } +/* +** ticks2msec +** +** Convert platform specific ticks to msec time +** Returns 0 on success. +*/ +PRUint32 ticks2msec(tmreader* aReader, PRUint32 aTicks) +{ + PRUint32 retval = 0; + PRUint64 bigone = LL_INIT(0, 1000); + PRUint64 tmp64; + + LL_UI2L(tmp64, aTicks); + LL_MUL(bigone, bigone, tmp64); + LL_UI2L(tmp64, aReader->ticksPerSec); + LL_DIV(bigone, bigone, tmp64); + LL_L2UI(retval, bigone); + return retval; +} + /* ** initOptions ** @@ -2222,7 +2242,7 @@ void tmEventHandler(tmreader* aReader, tmevent* aEvent) { eventType = TM_EVENT_FREE; } - trackEvent(aEvent->u.alloc.interval, eventType, callsite, aEvent->u.alloc.ptr, aEvent->u.alloc.size, oldcallsite, oldptr, oldsize); + trackEvent(ticks2msec(aReader, aEvent->u.alloc.interval), eventType, callsite, aEvent->u.alloc.ptr, aEvent->u.alloc.size, oldcallsite, oldptr, oldsize); } } else diff --git a/tools/trace-malloc/tmreader.c b/tools/trace-malloc/tmreader.c index da0a2231eaa..c493308ccef 100644 --- a/tools/trace-malloc/tmreader.c +++ b/tools/trace-malloc/tmreader.c @@ -43,6 +43,7 @@ #endif #include "prlog.h" #include "plhash.h" +#include "prnetdb.h" #include "nsTraceMalloc.h" #include "tmreader.h" @@ -169,6 +170,8 @@ static int get_tmevent(FILE *fp, tmevent *event) case TM_EVENT_FREE: if (!get_uint32(fp, &event->u.alloc.interval)) return 0; + if (!get_uint32(fp, &event->u.alloc.cost)) + return 0; if (!get_uint32(fp, &event->u.alloc.ptr)) return 0; if (!get_uint32(fp, &event->u.alloc.size)) @@ -176,11 +179,24 @@ static int get_tmevent(FILE *fp, tmevent *event) event->u.alloc.oldserial = 0; event->u.alloc.oldptr = 0; event->u.alloc.oldsize = 0; +#if defined(DEBUG_dp) + if (c == TM_EVENT_MALLOC) + printf("%d malloc %d 0x%p\n", event->u.alloc.cost, + event->u.alloc.size, event->u.alloc.ptr); + else if (c == TM_EVENT_CALLOC) + printf("%d calloc %d 0x%p\n", event->u.alloc.cost, + event->u.alloc.size, event->u.alloc.ptr); + else + printf("%d free %d 0x%p\n", event->u.alloc.cost, + event->u.alloc.size, event->u.alloc.ptr); +#endif break; case TM_EVENT_REALLOC: if (!get_uint32(fp, &event->u.alloc.interval)) return 0; + if (!get_uint32(fp, &event->u.alloc.cost)) + return 0; if (!get_uint32(fp, &event->u.alloc.ptr)) return 0; if (!get_uint32(fp, &event->u.alloc.size)) @@ -191,6 +207,10 @@ static int get_tmevent(FILE *fp, tmevent *event) return 0; if (!get_uint32(fp, &event->u.alloc.oldsize)) return 0; +#if defined(DEBUG_dp) + printf("%d realloc %d 0x%p %d\n", event->u.alloc.cost, + event->u.alloc.size, event->u.alloc.ptr, event->u.alloc.oldsize); +#endif break; case TM_EVENT_STATS: @@ -391,6 +411,16 @@ int tmreader_eventloop(tmreader *tmr, const char *filename, return 0; } + /* Read in ticks per second. Used to convert platform specific intervals to time values */ + if (read(fileno(fp), &tmr->ticksPerSec, sizeof tmr->ticksPerSec) != sizeof tmr->ticksPerSec) { + fprintf(stderr, "%s: Cannot read ticksPerSec. Log file read error.\n", + tmr->program); + return 0; + } + tmr->ticksPerSec = PR_ntohl(tmr->ticksPerSec); +#ifdef DEBUG_dp + printf("DEBUG: ticks per sec = %d\n", tmr->ticksPerSec); +#endif while (get_tmevent(fp, &event)) { switch (event.type) { case TM_EVENT_LIBRARY: { diff --git a/tools/trace-malloc/tmreader.h b/tools/trace-malloc/tmreader.h index 3e0ba94ce56..23a3e2f0bca 100644 --- a/tools/trace-malloc/tmreader.h +++ b/tools/trace-malloc/tmreader.h @@ -65,12 +65,13 @@ struct tmevent { uint32 offset; } site; struct { - uint32 interval; + uint32 interval; /* in ticks */ uint32 ptr; uint32 size; uint32 oldserial; uint32 oldptr; uint32 oldsize; + uint32 cost; /* in ticks */ } alloc; struct { nsTMStats tmstats; @@ -155,6 +156,7 @@ struct tmreader { PLHashTable *methods; PLHashTable *callsites; tmcallsite calltree_root; + uint32 ticksPerSec; }; typedef void (*tmeventhandler)(tmreader *tmr, tmevent *event);