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