• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* libxml2 - Library for parsing XML documents
2  * Copyright (C) 2006-2019 Free Software Foundation, Inc.
3  *
4  * This file is not part of the GNU gettext program, but is used with
5  * GNU gettext.
6  *
7  * The original copyright notice is as follows:
8  */
9 
10 /*
11  * Copyright (C) 1998-2012 Daniel Veillard.  All Rights Reserved.
12  *
13  * Permission is hereby granted, free of charge, to any person obtaining a copy
14  * of this software and associated documentation files (the "Software"), to deal
15  * in the Software without restriction, including without limitation the rights
16  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17  * copies of the Software, and to permit persons to whom the Software is fur-
18  * nished to do so, subject to the following conditions:
19  *
20  * The above copyright notice and this permission notice shall be included in
21  * all copies or substantial portions of the Software.
22  *
23  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
25  * NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
26  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
29  * THE SOFTWARE.
30  *
31  * Author: Daniel Veillard
32  */
33 
34 /*
35  * Summary: interface for the memory allocator
36  * Description: provides interfaces for the memory allocator,
37  *              including debugging capabilities.
38  */
39 
40 #ifndef __DEBUG_MEMORY_ALLOC__
41 #define __DEBUG_MEMORY_ALLOC__
42 
43 #include <stdio.h>
44 #include <libxml/xmlversion.h>
45 
46 /**
47  * DEBUG_MEMORY:
48  *
49  * DEBUG_MEMORY replaces the allocator with a collect and debug
50  * shell to the libc allocator.
51  * DEBUG_MEMORY should only be activated when debugging
52  * libxml i.e. if libxml has been configured with --with-debug-mem too.
53  */
54 /* #define DEBUG_MEMORY_FREED */
55 /* #define DEBUG_MEMORY_LOCATION */
56 
57 #ifdef DEBUG
58 #ifndef DEBUG_MEMORY
59 #define DEBUG_MEMORY
60 #endif
61 #endif
62 
63 /**
64  * DEBUG_MEMORY_LOCATION:
65  *
66  * DEBUG_MEMORY_LOCATION should be activated only when debugging
67  * libxml i.e. if libxml has been configured with --with-debug-mem too.
68  */
69 #ifdef DEBUG_MEMORY_LOCATION
70 #endif
71 
72 #ifdef __cplusplus
73 extern "C" {
74 #endif
75 
76 /*
77  * The XML memory wrapper support 4 basic overloadable functions.
78  */
79 /**
80  * xmlFreeFunc:
81  * @mem: an already allocated block of memory
82  *
83  * Signature for a free() implementation.
84  */
85 typedef void (XMLCALL *xmlFreeFunc)(void *mem);
86 /**
87  * xmlMallocFunc:
88  * @size:  the size requested in bytes
89  *
90  * Signature for a malloc() implementation.
91  *
92  * Returns a pointer to the newly allocated block or NULL in case of error.
93  */
94 typedef void *(LIBXML_ATTR_ALLOC_SIZE(1) XMLCALL *xmlMallocFunc)(size_t size);
95 
96 /**
97  * xmlReallocFunc:
98  * @mem: an already allocated block of memory
99  * @size:  the new size requested in bytes
100  *
101  * Signature for a realloc() implementation.
102  *
103  * Returns a pointer to the newly reallocated block or NULL in case of error.
104  */
105 typedef void *(XMLCALL *xmlReallocFunc)(void *mem, size_t size);
106 
107 /**
108  * xmlStrdupFunc:
109  * @str: a zero terminated string
110  *
111  * Signature for an strdup() implementation.
112  *
113  * Returns the copy of the string or NULL in case of error.
114  */
115 typedef char *(XMLCALL *xmlStrdupFunc)(const char *str);
116 
117 /*
118  * The 4 interfaces used for all memory handling within libxml.
119 LIBXML_DLL_IMPORT xmlFreeFunc xmlFree;
120 LIBXML_DLL_IMPORT xmlMallocFunc xmlMalloc;
121 LIBXML_DLL_IMPORT xmlMallocFunc xmlMallocAtomic;
122 LIBXML_DLL_IMPORT xmlReallocFunc xmlRealloc;
123 LIBXML_DLL_IMPORT xmlStrdupFunc xmlMemStrdup;
124  */
125 
126 /*
127  * The way to overload the existing functions.
128  * The xmlGc function have an extra entry for atomic block
129  * allocations useful for garbage collected memory allocators
130  */
131 XMLPUBFUN int XMLCALL
132 	xmlMemSetup	(xmlFreeFunc freeFunc,
133 			 xmlMallocFunc mallocFunc,
134 			 xmlReallocFunc reallocFunc,
135 			 xmlStrdupFunc strdupFunc);
136 XMLPUBFUN int XMLCALL
137 	xmlMemGet	(xmlFreeFunc *freeFunc,
138 			 xmlMallocFunc *mallocFunc,
139 			 xmlReallocFunc *reallocFunc,
140 			 xmlStrdupFunc *strdupFunc);
141 XMLPUBFUN int XMLCALL
142 	xmlGcMemSetup	(xmlFreeFunc freeFunc,
143 			 xmlMallocFunc mallocFunc,
144 			 xmlMallocFunc mallocAtomicFunc,
145 			 xmlReallocFunc reallocFunc,
146 			 xmlStrdupFunc strdupFunc);
147 XMLPUBFUN int XMLCALL
148 	xmlGcMemGet	(xmlFreeFunc *freeFunc,
149 			 xmlMallocFunc *mallocFunc,
150 			 xmlMallocFunc *mallocAtomicFunc,
151 			 xmlReallocFunc *reallocFunc,
152 			 xmlStrdupFunc *strdupFunc);
153 
154 /*
155  * Initialization of the memory layer.
156  */
157 XMLPUBFUN int XMLCALL
158 	xmlInitMemory	(void);
159 
160 /*
161  * Cleanup of the memory layer.
162  */
163 XMLPUBFUN void XMLCALL
164                 xmlCleanupMemory        (void);
165 /*
166  * These are specific to the XML debug memory wrapper.
167  */
168 XMLPUBFUN int XMLCALL
169 	xmlMemUsed	(void);
170 XMLPUBFUN int XMLCALL
171 	xmlMemBlocks	(void);
172 XMLPUBFUN void XMLCALL
173 	xmlMemDisplay	(FILE *fp);
174 XMLPUBFUN void XMLCALL
175 	xmlMemDisplayLast(FILE *fp, long nbBytes);
176 XMLPUBFUN void XMLCALL
177 	xmlMemShow	(FILE *fp, int nr);
178 XMLPUBFUN void XMLCALL
179 	xmlMemoryDump	(void);
180 XMLPUBFUN void * XMLCALL
181 	xmlMemMalloc	(size_t size) LIBXML_ATTR_ALLOC_SIZE(1);
182 XMLPUBFUN void * XMLCALL
183 	xmlMemRealloc	(void *ptr,size_t size);
184 XMLPUBFUN void XMLCALL
185 	xmlMemFree	(void *ptr);
186 XMLPUBFUN char * XMLCALL
187 	xmlMemoryStrdup	(const char *str);
188 XMLPUBFUN void * XMLCALL
189 	xmlMallocLoc	(size_t size, const char *file, int line) LIBXML_ATTR_ALLOC_SIZE(1);
190 XMLPUBFUN void * XMLCALL
191 	xmlReallocLoc	(void *ptr, size_t size, const char *file, int line);
192 XMLPUBFUN void * XMLCALL
193 	xmlMallocAtomicLoc (size_t size, const char *file, int line) LIBXML_ATTR_ALLOC_SIZE(1);
194 XMLPUBFUN char * XMLCALL
195 	xmlMemStrdupLoc	(const char *str, const char *file, int line);
196 
197 
198 #ifdef DEBUG_MEMORY_LOCATION
199 /**
200  * xmlMalloc:
201  * @size:  number of bytes to allocate
202  *
203  * Wrapper for the malloc() function used in the XML library.
204  *
205  * Returns the pointer to the allocated area or NULL in case of error.
206  */
207 #define xmlMalloc(size) xmlMallocLoc((size), __FILE__, __LINE__)
208 /**
209  * xmlMallocAtomic:
210  * @size:  number of bytes to allocate
211  *
212  * Wrapper for the malloc() function used in the XML library for allocation
213  * of block not containing pointers to other areas.
214  *
215  * Returns the pointer to the allocated area or NULL in case of error.
216  */
217 #define xmlMallocAtomic(size) xmlMallocAtomicLoc((size), __FILE__, __LINE__)
218 /**
219  * xmlRealloc:
220  * @ptr:  pointer to the existing allocated area
221  * @size:  number of bytes to allocate
222  *
223  * Wrapper for the realloc() function used in the XML library.
224  *
225  * Returns the pointer to the allocated area or NULL in case of error.
226  */
227 #define xmlRealloc(ptr, size) xmlReallocLoc((ptr), (size), __FILE__, __LINE__)
228 /**
229  * xmlMemStrdup:
230  * @str:  pointer to the existing string
231  *
232  * Wrapper for the strdup() function, xmlStrdup() is usually preferred.
233  *
234  * Returns the pointer to the allocated area or NULL in case of error.
235  */
236 #define xmlMemStrdup(str) xmlMemStrdupLoc((str), __FILE__, __LINE__)
237 
238 #endif /* DEBUG_MEMORY_LOCATION */
239 
240 #ifdef __cplusplus
241 }
242 #endif /* __cplusplus */
243 
244 #ifndef __XML_GLOBALS_H
245 #ifndef __XML_THREADS_H__
246 #include <libxml/threads.h>
247 #include <libxml/globals.h>
248 #endif
249 #endif
250 
251 #endif  /* __DEBUG_MEMORY_ALLOC__ */
252 
253