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 *(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);
 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);
 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);
 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