#ifndef __LYLEAKS_H /* * Avoid include redundancy * Include only if finding memory leaks. */ #define __LYLEAKS_H /* * Copyright (c) 1994, University of Kansas, All Rights Reserved * * Include File: LYLeaks.h * Purpose: Header to convert requests for allocation to Lynx * custom functions to track memory leaks. * Remarks/Portability/Dependencies/Restrictions: * For the stdlib.h allocation functions to be overriden by the * Lynx memory tracking functions all modules allocating, * freeing, or resizing memory must have LY_FIND_LEAKS * defined before including this file. * This header file should be included in every source file which * does any memory manipulation through use of the * stdlib.h memory functions. * For proper reporting of memory leaks, the function LYLeaks * should be registered for execution by atexit as the * very first executable statement in main. * This code is slow and should not be used except in debugging * circumstances (don't define LY_FIND_LEAKS). * If you are using LY_FIND_LEAKS and don't want the LYLeak* * memory functions to be used in a certain file, * define NO_MEMORY_TRACKING before including this file. * The only safe way to call the LYLeak* functions is to use * the below macros because they depend on the static * string created by __FILE__ to not be dynamic in * nature (don't free it and assume will exist at all * times during execution). * Revision History: * 05-26-94 created for Lynx 2-3-1, Garrett Arch Blythe */ /* * Required includes */ #include #include "HTUtils.h" /* * Constant defines */ #define MAX_CONTENT_LENGTH 50 #ifdef VMS #define LEAKAGE_SINK "sys$login:Lynx.leaks" #else #define LEAKAGE_SINK "Lynx.leaks" #endif /* VMS */ /* * Data structures */ typedef struct SourceLocation_tag { /* * The file name and line number of where an event took place. */ CONST char *cp_FileName; short ssi_LineNumber; } SourceLocation; typedef struct AllocationList_tag { /* * A singly linked list. */ struct AllocationList_tag *ALp_Next; /* * The memory pointer allocated. * If set to NULL, then an invalid request was made. * The invalid pointer also. */ void *vp_Alloced; void *vp_BadRequest; /* * The size in bytes of the allocated memory. */ size_t st_Bytes; /* * The source location of specific event (calloc, malloc, free). * realloc kept separate since will track last realloc on pointer. */ SourceLocation SL_memory; SourceLocation SL_realloc; } AllocationList; /* * Global variable declarations */ /* * Macros */ #if defined(LY_FIND_LEAKS) && !defined(NO_MEMORY_TRACKING) /* * Only use these macros if we are to track memory allocations. * The reason for using a macro instead of a define is that we want * to track where the initial allocation took place or where * the last reallocation took place. * Track where the allocation took place by the __FILE__ and __LINE__ * defines which are automatic to the compiler. */ #ifdef malloc #undef malloc #endif /* malloc */ #define malloc(st_bytes) LYLeakMalloc(st_bytes, __FILE__, __LINE__) #ifdef calloc #undef calloc #endif /* calloc */ #define calloc(st_number, st_bytes) LYLeakCalloc(st_number, st_bytes, \ __FILE__, __LINE__) #ifdef realloc #undef realloc #endif /* realloc */ #define realloc(vp_alloced, st_newbytes) LYLeakRealloc(vp_alloced, \ st_newbytes, __FILE__, __LINE__) #ifdef free #undef free #endif /* free */ #define free(vp_alloced) LYLeakFree(vp_alloced, __FILE__, __LINE__) #endif /* LY_FIND_LEAKS && !NO_MEMORY_TRACKING */ /* * Function declarations * See the appropriate source file for usage. */ PUBLIC void LYLeaks NOPARAMS; PUBLIC void *LYLeakMalloc PARAMS((size_t st_bytes, CONST char *cp_File, CONST short ssi_Line)); PUBLIC void *LYLeakCalloc PARAMS((size_t st_number, size_t st_bytes, CONST char *cp_File, CONST short ssi_Line)); PUBLIC void *LYLeakRealloc PARAMS((void *vp_alloced, size_t st_newbytes, CONST char *cp_File, CONST short ssi_Line)); PUBLIC void LYLeakFree PARAMS((void *vp_alloced, CONST char *cp_File, CONST short ssi_Line)); #endif /* __LYLEAKS_H */