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 *(ATTRIBUTE_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 extern xmlFreeFunc xmlFree; 92 LIBXML_DLL_IMPORT extern xmlMallocFunc xmlMalloc; 93 LIBXML_DLL_IMPORT extern xmlMallocFunc xmlMallocAtomic; 94 LIBXML_DLL_IMPORT extern xmlReallocFunc xmlRealloc; 95 LIBXML_DLL_IMPORT extern 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 XMLPUBFUN int XMLCALL 130 xmlInitMemory (void); 131 132 /* 133 * Cleanup of the memory layer. 134 */ 135 XMLPUBFUN void XMLCALL 136 xmlCleanupMemory (void); 137 /* 138 * These are specific to the XML debug memory wrapper. 139 */ 140 XMLPUBFUN int XMLCALL 141 xmlMemUsed (void); 142 XMLPUBFUN int XMLCALL 143 xmlMemBlocks (void); 144 XMLPUBFUN void XMLCALL 145 xmlMemDisplay (FILE *fp); 146 XMLPUBFUN void XMLCALL 147 xmlMemDisplayLast(FILE *fp, long nbBytes); 148 XMLPUBFUN void XMLCALL 149 xmlMemShow (FILE *fp, int nr); 150 XMLPUBFUN void XMLCALL 151 xmlMemoryDump (void); 152 XMLPUBFUN void * XMLCALL 153 xmlMemMalloc (size_t size) ATTRIBUTE_ALLOC_SIZE(1); 154 XMLPUBFUN void * XMLCALL 155 xmlMemRealloc (void *ptr,size_t size); 156 XMLPUBFUN void XMLCALL 157 xmlMemFree (void *ptr); 158 XMLPUBFUN char * XMLCALL 159 xmlMemoryStrdup (const char *str); 160 XMLPUBFUN void * XMLCALL 161 xmlMallocLoc (size_t size, const char *file, int line) ATTRIBUTE_ALLOC_SIZE(1); 162 XMLPUBFUN void * XMLCALL 163 xmlReallocLoc (void *ptr, size_t size, const char *file, int line); 164 XMLPUBFUN void * XMLCALL 165 xmlMallocAtomicLoc (size_t size, const char *file, int line) ATTRIBUTE_ALLOC_SIZE(1); 166 XMLPUBFUN char * XMLCALL 167 xmlMemStrdupLoc (const char *str, const char *file, int line); 168 169 170 #ifdef DEBUG_MEMORY_LOCATION 171 /** 172 * xmlMalloc: 173 * @size: number of bytes to allocate 174 * 175 * Wrapper for the malloc() function used in the XML library. 176 * 177 * Returns the pointer to the allocated area or NULL in case of error. 178 */ 179 #define xmlMalloc(size) xmlMallocLoc((size), __FILE__, __LINE__) 180 /** 181 * xmlMallocAtomic: 182 * @size: number of bytes to allocate 183 * 184 * Wrapper for the malloc() function used in the XML library for allocation 185 * of block not containing pointers to other areas. 186 * 187 * Returns the pointer to the allocated area or NULL in case of error. 188 */ 189 #define xmlMallocAtomic(size) xmlMallocAtomicLoc((size), __FILE__, __LINE__) 190 /** 191 * xmlRealloc: 192 * @ptr: pointer to the existing allocated area 193 * @size: number of bytes to allocate 194 * 195 * Wrapper for the realloc() function used in the XML library. 196 * 197 * Returns the pointer to the allocated area or NULL in case of error. 198 */ 199 #define xmlRealloc(ptr, size) xmlReallocLoc((ptr), (size), __FILE__, __LINE__) 200 /** 201 * xmlMemStrdup: 202 * @str: pointer to the existing string 203 * 204 * Wrapper for the strdup() function, xmlStrdup() is usually preferred. 205 * 206 * Returns the pointer to the allocated area or NULL in case of error. 207 */ 208 #define xmlMemStrdup(str) xmlMemStrdupLoc((str), __FILE__, __LINE__) 209 210 #endif /* DEBUG_MEMORY_LOCATION */ 211 212 #ifdef __cplusplus 213 } 214 #endif /* __cplusplus */ 215 216 #ifndef __XML_GLOBALS_H 217 #ifndef __XML_THREADS_H__ 218 #include <libxml/threads.h> 219 #include <libxml/globals.h> 220 #endif 221 #endif 222 223 #endif /* __DEBUG_MEMORY_ALLOC__ */ 224 225