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 45extern "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 */ 57typedef 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 */ 66typedef 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 */ 77typedef 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 */ 87typedef char *(XMLCALL *xmlStrdupFunc)(const char *str); 88 89/* 90 * The 4 interfaces used for all memory handling within libxml. 91LIBXML_DLL_IMPORT xmlFreeFunc xmlFree; 92LIBXML_DLL_IMPORT xmlMallocFunc xmlMalloc; 93LIBXML_DLL_IMPORT xmlMallocFunc xmlMallocAtomic; 94LIBXML_DLL_IMPORT xmlReallocFunc xmlRealloc; 95LIBXML_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 */ 103XMLPUBFUN int XMLCALL 104 xmlMemSetup (xmlFreeFunc freeFunc, 105 xmlMallocFunc mallocFunc, 106 xmlReallocFunc reallocFunc, 107 xmlStrdupFunc strdupFunc); 108XMLPUBFUN int XMLCALL 109 xmlMemGet (xmlFreeFunc *freeFunc, 110 xmlMallocFunc *mallocFunc, 111 xmlReallocFunc *reallocFunc, 112 xmlStrdupFunc *strdupFunc); 113XMLPUBFUN int XMLCALL 114 xmlGcMemSetup (xmlFreeFunc freeFunc, 115 xmlMallocFunc mallocFunc, 116 xmlMallocFunc mallocAtomicFunc, 117 xmlReallocFunc reallocFunc, 118 xmlStrdupFunc strdupFunc); 119XMLPUBFUN 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 */ 129XMLPUBFUN int XMLCALL 130 xmlInitMemory (void); 131 132/* 133 * Cleanup of the memory layer. 134 */ 135XMLPUBFUN void XMLCALL 136 xmlCleanupMemory (void); 137/* 138 * These are specific to the XML debug memory wrapper. 139 */ 140XMLPUBFUN int XMLCALL 141 xmlMemUsed (void); 142XMLPUBFUN int XMLCALL 143 xmlMemBlocks (void); 144XMLPUBFUN void XMLCALL 145 xmlMemDisplay (FILE *fp); 146XMLPUBFUN void XMLCALL 147 xmlMemDisplayLast(FILE *fp, long nbBytes); 148XMLPUBFUN void XMLCALL 149 xmlMemShow (FILE *fp, int nr); 150XMLPUBFUN void XMLCALL 151 xmlMemoryDump (void); 152XMLPUBFUN void * XMLCALL 153 xmlMemMalloc (size_t size) LIBXML_ATTR_ALLOC_SIZE(1); 154XMLPUBFUN void * XMLCALL 155 xmlMemRealloc (void *ptr,size_t size); 156XMLPUBFUN void XMLCALL 157 xmlMemFree (void *ptr); 158XMLPUBFUN char * XMLCALL 159 xmlMemoryStrdup (const char *str); 160XMLPUBFUN void * XMLCALL 161 xmlMallocLoc (size_t size, const char *file, int line) LIBXML_ATTR_ALLOC_SIZE(1); 162XMLPUBFUN void * XMLCALL 163 xmlReallocLoc (void *ptr, size_t size, const char *file, int line); 164XMLPUBFUN void * XMLCALL 165 xmlMallocAtomicLoc (size_t size, const char *file, int line) LIBXML_ATTR_ALLOC_SIZE(1); 166XMLPUBFUN 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