1 /*
2  * Summary: interface for the memory allocator
3  * Description: provides interfaces for the memory allocator,
4  *              including debugging capabilities.
5  *
6  * Copy: See Copyright for the status of this software.
7  *
8  * Author: Daniel Veillard
9  */
10 
11 
12 #ifndef __DEBUG_MEMORY_ALLOC__
13 #define __DEBUG_MEMORY_ALLOC__
14 
15 #include <stdio.h>
16 #include <libxml/xmlversion.h>
17 
18 /**
19  * DEBUG_MEMORY:
20  *
21  * DEBUG_MEMORY replaces the allocator with a collect and debug
22  * shell to the libc allocator.
23  * DEBUG_MEMORY should only be activated when debugging
24  * libxml i.e. if libxml has been configured with --with-debug-mem too.
25  */
26 /* #define DEBUG_MEMORY_FREED */
27 /* #define DEBUG_MEMORY_LOCATION */
28 
29 #ifdef DEBUG
30 #ifndef DEBUG_MEMORY
31 #define DEBUG_MEMORY
32 #endif
33 #endif
34 
35 /**
36  * DEBUG_MEMORY_LOCATION:
37  *
38  * DEBUG_MEMORY_LOCATION should be activated only when debugging
39  * libxml i.e. if libxml has been configured with --with-debug-mem too.
40  */
41 #ifdef DEBUG_MEMORY_LOCATION
42 #endif
43 
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47 
48 /*
49  * The XML memory wrapper support 4 basic overloadable functions.
50  */
51 /**
52  * xmlFreeFunc:
53  * @mem: an already allocated block of memory
54  *
55  * Signature for a free() implementation.
56  */
57 typedef void (XMLCALL *xmlFreeFunc)(void *mem);
58 /**
59  * xmlMallocFunc:
60  * @size:  the size requested in bytes
61  *
62  * Signature for a malloc() implementation.
63  *
64  * Returns a pointer to the newly allocated block or NULL in case of error.
65  */
66 typedef void *(LIBXML_ATTR_ALLOC_SIZE(1) XMLCALL *xmlMallocFunc)(size_t size);
67 
68 /**
69  * xmlReallocFunc:
70  * @mem: an already allocated block of memory
71  * @size:  the new size requested in bytes
72  *
73  * Signature for a realloc() implementation.
74  *
75  * Returns a pointer to the newly reallocated block or NULL in case of error.
76  */
77 typedef void *(XMLCALL *xmlReallocFunc)(void *mem, size_t size);
78 
79 /**
80  * xmlStrdupFunc:
81  * @str: a zero terminated string
82  *
83  * Signature for an strdup() implementation.
84  *
85  * Returns the copy of the string or NULL in case of error.
86  */
87 typedef char *(XMLCALL *xmlStrdupFunc)(const char *str);
88 
89 /*
90  * The 4 interfaces used for all memory handling within libxml.
91 LIBXML_DLL_IMPORT xmlFreeFunc xmlFree;
92 LIBXML_DLL_IMPORT xmlMallocFunc xmlMalloc;
93 LIBXML_DLL_IMPORT xmlMallocFunc xmlMallocAtomic;
94 LIBXML_DLL_IMPORT xmlReallocFunc xmlRealloc;
95 LIBXML_DLL_IMPORT xmlStrdupFunc xmlMemStrdup;
96  */
97 
98 /*
99  * The way to overload the existing functions.
100  * The xmlGc function have an extra entry for atomic block
101  * allocations useful for garbage collected memory allocators
102  */
103 XMLPUBFUN int XMLCALL
104 	xmlMemSetup	(xmlFreeFunc freeFunc,
105 			 xmlMallocFunc mallocFunc,
106 			 xmlReallocFunc reallocFunc,
107 			 xmlStrdupFunc strdupFunc);
108 XMLPUBFUN int XMLCALL
109 	xmlMemGet	(xmlFreeFunc *freeFunc,
110 			 xmlMallocFunc *mallocFunc,
111 			 xmlReallocFunc *reallocFunc,
112 			 xmlStrdupFunc *strdupFunc);
113 XMLPUBFUN int XMLCALL
114 	xmlGcMemSetup	(xmlFreeFunc freeFunc,
115 			 xmlMallocFunc mallocFunc,
116 			 xmlMallocFunc mallocAtomicFunc,
117 			 xmlReallocFunc reallocFunc,
118 			 xmlStrdupFunc strdupFunc);
119 XMLPUBFUN int XMLCALL
120 	xmlGcMemGet	(xmlFreeFunc *freeFunc,
121 			 xmlMallocFunc *mallocFunc,
122 			 xmlMallocFunc *mallocAtomicFunc,
123 			 xmlReallocFunc *reallocFunc,
124 			 xmlStrdupFunc *strdupFunc);
125 
126 /*
127  * Initialization of the memory layer.
128  */
129 XML_DEPRECATED
130 XMLPUBFUN int XMLCALL
131 	xmlInitMemory	(void);
132 
133 /*
134  * Cleanup of the memory layer.
135  */
136 XML_DEPRECATED
137 XMLPUBFUN void XMLCALL
138                 xmlCleanupMemory        (void);
139 /*
140  * These are specific to the XML debug memory wrapper.
141  */
142 XMLPUBFUN int XMLCALL
143 	xmlMemUsed	(void);
144 XMLPUBFUN int XMLCALL
145 	xmlMemBlocks	(void);
146 XMLPUBFUN void XMLCALL
147 	xmlMemDisplay	(FILE *fp);
148 XMLPUBFUN void XMLCALL
149 	xmlMemDisplayLast(FILE *fp, long nbBytes);
150 XMLPUBFUN void XMLCALL
151 	xmlMemShow	(FILE *fp, int nr);
152 XMLPUBFUN void XMLCALL
153 	xmlMemoryDump	(void);
154 XMLPUBFUN void * XMLCALL
155 	xmlMemMalloc	(size_t size) LIBXML_ATTR_ALLOC_SIZE(1);
156 XMLPUBFUN void * XMLCALL
157 	xmlMemRealloc	(void *ptr,size_t size);
158 XMLPUBFUN void XMLCALL
159 	xmlMemFree	(void *ptr);
160 XMLPUBFUN char * XMLCALL
161 	xmlMemoryStrdup	(const char *str);
162 XMLPUBFUN void * XMLCALL
163 	xmlMallocLoc	(size_t size, const char *file, int line) LIBXML_ATTR_ALLOC_SIZE(1);
164 XMLPUBFUN void * XMLCALL
165 	xmlReallocLoc	(void *ptr, size_t size, const char *file, int line);
166 XMLPUBFUN void * XMLCALL
167 	xmlMallocAtomicLoc (size_t size, const char *file, int line) LIBXML_ATTR_ALLOC_SIZE(1);
168 XMLPUBFUN char * XMLCALL
169 	xmlMemStrdupLoc	(const char *str, const char *file, int line);
170 
171 
172 #ifdef DEBUG_MEMORY_LOCATION
173 /**
174  * xmlMalloc:
175  * @size:  number of bytes to allocate
176  *
177  * Wrapper for the malloc() function used in the XML library.
178  *
179  * Returns the pointer to the allocated area or NULL in case of error.
180  */
181 #define xmlMalloc(size) xmlMallocLoc((size), __FILE__, __LINE__)
182 /**
183  * xmlMallocAtomic:
184  * @size:  number of bytes to allocate
185  *
186  * Wrapper for the malloc() function used in the XML library for allocation
187  * of block not containing pointers to other areas.
188  *
189  * Returns the pointer to the allocated area or NULL in case of error.
190  */
191 #define xmlMallocAtomic(size) xmlMallocAtomicLoc((size), __FILE__, __LINE__)
192 /**
193  * xmlRealloc:
194  * @ptr:  pointer to the existing allocated area
195  * @size:  number of bytes to allocate
196  *
197  * Wrapper for the realloc() function used in the XML library.
198  *
199  * Returns the pointer to the allocated area or NULL in case of error.
200  */
201 #define xmlRealloc(ptr, size) xmlReallocLoc((ptr), (size), __FILE__, __LINE__)
202 /**
203  * xmlMemStrdup:
204  * @str:  pointer to the existing string
205  *
206  * Wrapper for the strdup() function, xmlStrdup() is usually preferred.
207  *
208  * Returns the pointer to the allocated area or NULL in case of error.
209  */
210 #define xmlMemStrdup(str) xmlMemStrdupLoc((str), __FILE__, __LINE__)
211 
212 #endif /* DEBUG_MEMORY_LOCATION */
213 
214 #ifdef __cplusplus
215 }
216 #endif /* __cplusplus */
217 
218 #ifndef __XML_GLOBALS_H
219 #ifndef __XML_THREADS_H__
220 #include <libxml/threads.h>
221 #include <libxml/globals.h>
222 #endif
223 #endif
224 
225 #endif  /* __DEBUG_MEMORY_ALLOC__ */
226 
227