#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 <stdlib.h>
#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 */