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