about summary refs log tree commit diff stats
path: root/WWW/Library/Implementation/LYLeaks.h
blob: 5ecf8e67d2bdadc98e623d08f6be60e6a077daef (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
#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
**	10-30-97	modified to handle StrAllocCopy() and
**			StrAllocCat(). - KW & FM
*/

/*
**  Required includes
*/

#ifndef HTUTILS_H
#include <HTUtils.h>
#endif

/*
**	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__)

/*
**  Added the following two defines to track Lynx's frequent use
**  of those macros. - KW 1997-10-12
*/
#ifdef StrAllocCopy
#undef StrAllocCopy
#endif /* StrAllocCopy */
#define StrAllocCopy(dest, src) LYLeakSACopy(&(dest), src, __FILE__, __LINE__)
#ifdef StrAllocCat
#undef StrAllocCat
#endif /* StrAllocCat */
#define StrAllocCat(dest, src)  LYLeakSACat(&(dest), src, __FILE__, __LINE__)

#endif /* LY_FIND_LEAKS && !NO_MEMORY_TRACKING */

/*
**	Function declarations
**	See the appropriate source file for usage.
*/
extern void LYLeaks NOPARAMS;
extern void *LYLeakMalloc PARAMS((
	size_t		st_bytes,
	CONST char *	cp_File,
	CONST short	ssi_Line));
extern void *LYLeakCalloc PARAMS((
	size_t		st_number,
	size_t		st_bytes,
	CONST char *	cp_File,
	CONST short	ssi_Line));
extern void *LYLeakRealloc PARAMS((
	void *		vp_alloced,
	size_t		st_newbytes,
	CONST char *	cp_File,
	CONST short	ssi_Line));
extern void LYLeakFree PARAMS((
	void *		vp_alloced,
	CONST char *	cp_File,
	CONST short	ssi_Line));
extern char * LYLeakSACopy PARAMS((
	char **		dest,
	CONST char *	src,
	CONST char *	cp_File,
	CONST short	ssi_Line));
extern char * LYLeakSACat PARAMS((
	char **		dest,
	CONST char *	src,
	CONST char *	cp_File,
	CONST short	ssi_Line));

#endif /* __LYLEAKS_H */