From: mdw Date: Wed, 20 Aug 1997 16:25:37 +0000 (+0000) Subject: Add some simple `malloc' tracking. X-Git-Tag: 1.3.3~108 X-Git-Url: https://git.distorted.org.uk/~mdw/become/commitdiff_plain/deab2ee82eb974047777ad721bccecaca103d2a9 Add some simple `malloc' tracking. --- diff --git a/src/utils.c b/src/utils.c index 7867411..830e037 100644 --- a/src/utils.c +++ b/src/utils.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: utils.c,v 1.2 1997/08/04 10:24:26 mdw Exp $ + * $Id: utils.c,v 1.3 1997/08/20 16:25:37 mdw Exp $ * * Miscellaneous useful bits of code. * @@ -29,6 +29,9 @@ /*----- Revision history --------------------------------------------------* * * $Log: utils.c,v $ + * Revision 1.3 1997/08/20 16:25:37 mdw + * Add some simple `malloc' tracking. + * * Revision 1.2 1997/08/04 10:24:26 mdw * Sources placed under CVS control. * @@ -324,4 +327,169 @@ void *xrealloc(void *p, size_t sz) return (p); } +/*----- Simple memory use tracking ----------------------------------------*/ + +#ifdef TRACK_MALLOC + +/*#define TRACK_VERBOSE*/ + +/* --- A type to record a size and have a nice alignment --- */ + +typedef union szblock { + struct { + union szblock *next; + union szblock *prev; + size_t sz; + } x; + long double _ld; + void *_p; +} szblock; + +/* --- Static data --- */ + +static unsigned int memused = 0; +static szblock *memlist; + +/* --- @track_malloc@ --- * + * + * Arguments: @size_t sz@ = size requested + * + * Returns: Pointer to allocated space, or null + * + * Use: Allocates memory, and tracks how much is allocated. + */ + +void *track_malloc(size_t sz) +{ + szblock *q = (malloc)(sz + sizeof(szblock)); + if (q) { + memused += sz; +#ifdef TRACK_VERBOSE + printf("[%p] allocated %lu\n", (void *)(q + 1), (unsigned long)sz); +#endif + q->x.sz = sz; + q->x.next = memlist; + q->x.prev = 0; + if (q->x.next) + q->x.next->x.prev = q; + memlist = q; + return (q + 1); + } + return (0); +} + +/* --- @track_free@ --- * + * + * Arguments: @void *p@ = pointer to an allocated block + * + * Returns: --- + * + * Use: Frees memory, and tracks how much is still allocated. + */ + +void track_free(void *p) +{ + szblock *q; + + if (!p) + return; + q = (szblock *)p - 1; +#ifdef TRACK_VERBOSE + printf("[%p] freed %lu\n", (void *)(q + 1), (unsigned long)q->x.sz); +#endif + if (q->x.next) + q->x.next->x.prev = q->x.prev; + if (q->x.prev) + q->x.prev->x.next = q->x.next; + else + memlist = q->x.next; + memused -= q->x.sz; + (free)(q); +} + +/* --- @track_realloc@ --- * + * + * Arguments: @void *p@ = pointer to an allocated block + * @size_t sz@ = how big it wants to be + * + * Returns: Pointer to the new block. + * + * Use: Reallocates a block, tracking how much memory is still + * available. + */ + +void *track_realloc(void *p, size_t sz) +{ + size_t osz; + szblock *q, *qq; + if (p) { + q = (szblock *)p - 1; + osz = q->x.sz; + if (q->x.next) + q->x.next->x.prev = q->x.prev; + if (q->x.prev) + q->x.prev->x.next = q->x.next; + else + memlist = q->x.next; + } else { + q = 0; + osz = 0; + } + qq = (realloc)(q, sz + sizeof(szblock)); + if (qq) { +#ifdef TRACK_VERBOSE + printf("[%p->%p] reallocated %lu -> %lu\n", + (void *)(q + 1), (void *)(qq + 1), + (unsigned long)osz, (unsigned long)sz); +#endif + qq->x.sz = sz; + qq->x.next = memlist; + qq->x.prev = 0; + if (qq->x.next) + qq->x.next->x.prev = qq; + memlist = qq; + memused += sz - osz; + qq->x.sz = sz; + return (qq + 1); + } + return (0); +} + +/* --- @track_memused@ --- * + * + * Arguments: --- + * + * Returns: A count of how much memory is used currently. + * + * Use: Returns the amount of memory which the @track_@-functions + * above have counted as being currently allocated. + */ + +unsigned long track_memused(void) +{ + return (memused); +} + +/* --- @track_memlist@ --- * + * + * Arguments: --- + * + * Returns: --- + * + * Use: Dumps a list of allocated blocks to standard output. + */ + +void track_memlist(void) +{ + szblock *q = memlist; + printf("listing blocks:\n"); + while (q) { + printf("... [%p] %lu\n", (void *)(q + 1), (unsigned long)q->x.sz); + q = q->x.next; + } + printf("done\n"); +} + +#endif + /*----- That's all, folks -------------------------------------------------*/ diff --git a/src/utils.h b/src/utils.h index dce373e..869c4e9 100644 --- a/src/utils.h +++ b/src/utils.h @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: utils.h,v 1.2 1997/08/04 10:24:26 mdw Exp $ + * $Id: utils.h,v 1.3 1997/08/20 16:25:37 mdw Exp $ * * Miscellaneous useful bits of code. * @@ -29,6 +29,9 @@ /*----- Revision history --------------------------------------------------* * * $Log: utils.h,v $ + * Revision 1.3 1997/08/20 16:25:37 mdw + * Add some simple `malloc' tracking. + * * Revision 1.2 1997/08/04 10:24:26 mdw * Sources placed under CVS control. * @@ -263,6 +266,81 @@ extern char *xstrdup(const char */*s*/); extern void *xrealloc(void */*p*/, size_t /*sz*/); +/*----- Simple memory use tracking ----------------------------------------*/ + +#undef TRACK_MALLOC + +#ifdef TRACK_MALLOC + +/* --- @track_malloc@ --- * + * + * Arguments: @size_t sz@ = size requested + * + * Returns: Pointer to allocated space, or null + * + * Use: Allocates memory, and tracks how much is allocated. + */ + +extern void *track_malloc(size_t /*sz*/); + +/* --- @track_free@ --- * + * + * Arguments: @void *p@ = pointer to an allocated block + * + * Returns: --- + * + * Use: Frees memory, and tracks how much is still allocated. + */ + +extern void track_free(void */*p*/); + +/* --- @track_realloc@ --- * + * + * Arguments: @void *p@ = pointer to an allocated block + * @size_t sz@ = how big it wants to be + * + * Returns: Pointer to the new block. + * + * Use: Reallocates a block, tracking how much memory is still + * available. + */ + +extern void *track_realloc(void */*p*/, size_t /*sz*/); + +/* --- @track_memused@ --- * + * + * Arguments: --- + * + * Returns: A count of how much memory is used currently. + * + * Use: Returns the amount of memory which the @track_@-functions + * above have counted as being currently allocated. + */ + +extern unsigned long track_memused(void); + +/* --- @track_memlist@ --- * + * + * Arguments: --- + * + * Returns: --- + * + * Use: Dumps a list of allocated blocks to standard output. + */ + +extern void track_memlist(void); + +#undef malloc +#define malloc(sz) track_malloc(sz) + +#undef free +#define free(p) track_free(p) + +#undef realloc +#define realloc(p, sz) track_realloc(p, sz) + +#endif + /*----- That's all, folks -------------------------------------------------*/ #ifdef __cplusplus