xref: /aosp_15_r20/external/libxml2/xmlmemory.c (revision 7c5688314b92172186c154356a6374bf7684c3ca)
1*7c568831SAndroid Build Coastguard Worker /*
2*7c568831SAndroid Build Coastguard Worker  * xmlmemory.c:  libxml memory allocator wrapper.
3*7c568831SAndroid Build Coastguard Worker  *
4*7c568831SAndroid Build Coastguard Worker  * [email protected]
5*7c568831SAndroid Build Coastguard Worker  */
6*7c568831SAndroid Build Coastguard Worker 
7*7c568831SAndroid Build Coastguard Worker #define IN_LIBXML
8*7c568831SAndroid Build Coastguard Worker #include "libxml.h"
9*7c568831SAndroid Build Coastguard Worker 
10*7c568831SAndroid Build Coastguard Worker #include <string.h>
11*7c568831SAndroid Build Coastguard Worker #include <stdlib.h>
12*7c568831SAndroid Build Coastguard Worker #include <ctype.h>
13*7c568831SAndroid Build Coastguard Worker #include <time.h>
14*7c568831SAndroid Build Coastguard Worker 
15*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlmemory.h>
16*7c568831SAndroid Build Coastguard Worker #include <libxml/xmlerror.h>
17*7c568831SAndroid Build Coastguard Worker #include <libxml/parser.h>
18*7c568831SAndroid Build Coastguard Worker #include <libxml/threads.h>
19*7c568831SAndroid Build Coastguard Worker 
20*7c568831SAndroid Build Coastguard Worker #include "private/error.h"
21*7c568831SAndroid Build Coastguard Worker #include "private/memory.h"
22*7c568831SAndroid Build Coastguard Worker #include "private/threads.h"
23*7c568831SAndroid Build Coastguard Worker 
24*7c568831SAndroid Build Coastguard Worker static unsigned long  debugMemSize = 0;
25*7c568831SAndroid Build Coastguard Worker static unsigned long  debugMemBlocks = 0;
26*7c568831SAndroid Build Coastguard Worker static xmlMutex xmlMemMutex;
27*7c568831SAndroid Build Coastguard Worker 
28*7c568831SAndroid Build Coastguard Worker /************************************************************************
29*7c568831SAndroid Build Coastguard Worker  *									*
30*7c568831SAndroid Build Coastguard Worker  *		Macros, variables and associated types			*
31*7c568831SAndroid Build Coastguard Worker  *									*
32*7c568831SAndroid Build Coastguard Worker  ************************************************************************/
33*7c568831SAndroid Build Coastguard Worker 
34*7c568831SAndroid Build Coastguard Worker /*
35*7c568831SAndroid Build Coastguard Worker  * Each of the blocks allocated begin with a header containing information
36*7c568831SAndroid Build Coastguard Worker  */
37*7c568831SAndroid Build Coastguard Worker 
38*7c568831SAndroid Build Coastguard Worker #define MEMTAG 0x5aa5U
39*7c568831SAndroid Build Coastguard Worker 
40*7c568831SAndroid Build Coastguard Worker typedef struct memnod {
41*7c568831SAndroid Build Coastguard Worker     unsigned int   mh_tag;
42*7c568831SAndroid Build Coastguard Worker     size_t         mh_size;
43*7c568831SAndroid Build Coastguard Worker } MEMHDR;
44*7c568831SAndroid Build Coastguard Worker 
45*7c568831SAndroid Build Coastguard Worker #ifdef SUN4
46*7c568831SAndroid Build Coastguard Worker #define ALIGN_SIZE  16
47*7c568831SAndroid Build Coastguard Worker #else
48*7c568831SAndroid Build Coastguard Worker #define ALIGN_SIZE  sizeof(double)
49*7c568831SAndroid Build Coastguard Worker #endif
50*7c568831SAndroid Build Coastguard Worker #define RESERVE_SIZE (((sizeof(MEMHDR) + ALIGN_SIZE - 1) \
51*7c568831SAndroid Build Coastguard Worker 		      / ALIGN_SIZE ) * ALIGN_SIZE)
52*7c568831SAndroid Build Coastguard Worker 
53*7c568831SAndroid Build Coastguard Worker #define MAX_SIZE_T ((size_t)-1)
54*7c568831SAndroid Build Coastguard Worker 
55*7c568831SAndroid Build Coastguard Worker #define CLIENT_2_HDR(a) ((void *) (((char *) (a)) - RESERVE_SIZE))
56*7c568831SAndroid Build Coastguard Worker #define HDR_2_CLIENT(a)    ((void *) (((char *) (a)) + RESERVE_SIZE))
57*7c568831SAndroid Build Coastguard Worker 
58*7c568831SAndroid Build Coastguard Worker /**
59*7c568831SAndroid Build Coastguard Worker  * xmlMallocLoc:
60*7c568831SAndroid Build Coastguard Worker  * @size:  an int specifying the size in byte to allocate.
61*7c568831SAndroid Build Coastguard Worker  * @file:  the file name or NULL
62*7c568831SAndroid Build Coastguard Worker  * @line:  the line number
63*7c568831SAndroid Build Coastguard Worker  *
64*7c568831SAndroid Build Coastguard Worker  * DEPRECATED: don't use
65*7c568831SAndroid Build Coastguard Worker  *
66*7c568831SAndroid Build Coastguard Worker  * Returns a pointer to the allocated area or NULL in case of lack of memory.
67*7c568831SAndroid Build Coastguard Worker  */
68*7c568831SAndroid Build Coastguard Worker void *
xmlMallocLoc(size_t size,const char * file ATTRIBUTE_UNUSED,int line ATTRIBUTE_UNUSED)69*7c568831SAndroid Build Coastguard Worker xmlMallocLoc(size_t size, const char *file ATTRIBUTE_UNUSED,
70*7c568831SAndroid Build Coastguard Worker              int line ATTRIBUTE_UNUSED)
71*7c568831SAndroid Build Coastguard Worker {
72*7c568831SAndroid Build Coastguard Worker     return(xmlMemMalloc(size));
73*7c568831SAndroid Build Coastguard Worker }
74*7c568831SAndroid Build Coastguard Worker 
75*7c568831SAndroid Build Coastguard Worker /**
76*7c568831SAndroid Build Coastguard Worker  * xmlMallocAtomicLoc:
77*7c568831SAndroid Build Coastguard Worker  * @size:  an unsigned int specifying the size in byte to allocate.
78*7c568831SAndroid Build Coastguard Worker  * @file:  the file name or NULL
79*7c568831SAndroid Build Coastguard Worker  * @line:  the line number
80*7c568831SAndroid Build Coastguard Worker  *
81*7c568831SAndroid Build Coastguard Worker  * DEPRECATED: don't use
82*7c568831SAndroid Build Coastguard Worker  *
83*7c568831SAndroid Build Coastguard Worker  * Returns a pointer to the allocated area or NULL in case of lack of memory.
84*7c568831SAndroid Build Coastguard Worker  */
85*7c568831SAndroid Build Coastguard Worker void *
xmlMallocAtomicLoc(size_t size,const char * file ATTRIBUTE_UNUSED,int line ATTRIBUTE_UNUSED)86*7c568831SAndroid Build Coastguard Worker xmlMallocAtomicLoc(size_t size, const char *file ATTRIBUTE_UNUSED,
87*7c568831SAndroid Build Coastguard Worker                    int line ATTRIBUTE_UNUSED)
88*7c568831SAndroid Build Coastguard Worker {
89*7c568831SAndroid Build Coastguard Worker     return(xmlMemMalloc(size));
90*7c568831SAndroid Build Coastguard Worker }
91*7c568831SAndroid Build Coastguard Worker 
92*7c568831SAndroid Build Coastguard Worker /**
93*7c568831SAndroid Build Coastguard Worker  * xmlMemMalloc:
94*7c568831SAndroid Build Coastguard Worker  * @size:  an int specifying the size in byte to allocate.
95*7c568831SAndroid Build Coastguard Worker  *
96*7c568831SAndroid Build Coastguard Worker  * a malloc() equivalent, with logging of the allocation info.
97*7c568831SAndroid Build Coastguard Worker  *
98*7c568831SAndroid Build Coastguard Worker  * Returns a pointer to the allocated area or NULL in case of lack of memory.
99*7c568831SAndroid Build Coastguard Worker  */
100*7c568831SAndroid Build Coastguard Worker void *
xmlMemMalloc(size_t size)101*7c568831SAndroid Build Coastguard Worker xmlMemMalloc(size_t size)
102*7c568831SAndroid Build Coastguard Worker {
103*7c568831SAndroid Build Coastguard Worker     MEMHDR *p;
104*7c568831SAndroid Build Coastguard Worker 
105*7c568831SAndroid Build Coastguard Worker     xmlInitParser();
106*7c568831SAndroid Build Coastguard Worker 
107*7c568831SAndroid Build Coastguard Worker     if (size > (MAX_SIZE_T - RESERVE_SIZE))
108*7c568831SAndroid Build Coastguard Worker         return(NULL);
109*7c568831SAndroid Build Coastguard Worker 
110*7c568831SAndroid Build Coastguard Worker     p = (MEMHDR *) malloc(RESERVE_SIZE + size);
111*7c568831SAndroid Build Coastguard Worker     if (!p)
112*7c568831SAndroid Build Coastguard Worker         return(NULL);
113*7c568831SAndroid Build Coastguard Worker     p->mh_tag = MEMTAG;
114*7c568831SAndroid Build Coastguard Worker     p->mh_size = size;
115*7c568831SAndroid Build Coastguard Worker 
116*7c568831SAndroid Build Coastguard Worker     xmlMutexLock(&xmlMemMutex);
117*7c568831SAndroid Build Coastguard Worker     debugMemSize += size;
118*7c568831SAndroid Build Coastguard Worker     debugMemBlocks++;
119*7c568831SAndroid Build Coastguard Worker     xmlMutexUnlock(&xmlMemMutex);
120*7c568831SAndroid Build Coastguard Worker 
121*7c568831SAndroid Build Coastguard Worker     return(HDR_2_CLIENT(p));
122*7c568831SAndroid Build Coastguard Worker }
123*7c568831SAndroid Build Coastguard Worker 
124*7c568831SAndroid Build Coastguard Worker /**
125*7c568831SAndroid Build Coastguard Worker  * xmlReallocLoc:
126*7c568831SAndroid Build Coastguard Worker  * @ptr:  the initial memory block pointer
127*7c568831SAndroid Build Coastguard Worker  * @size:  an int specifying the size in byte to allocate.
128*7c568831SAndroid Build Coastguard Worker  * @file:  the file name or NULL
129*7c568831SAndroid Build Coastguard Worker  * @line:  the line number
130*7c568831SAndroid Build Coastguard Worker  *
131*7c568831SAndroid Build Coastguard Worker  * DEPRECATED: don't use
132*7c568831SAndroid Build Coastguard Worker  *
133*7c568831SAndroid Build Coastguard Worker  * Returns a pointer to the allocated area or NULL in case of lack of memory.
134*7c568831SAndroid Build Coastguard Worker  */
135*7c568831SAndroid Build Coastguard Worker void *
xmlReallocLoc(void * ptr,size_t size,const char * file ATTRIBUTE_UNUSED,int line ATTRIBUTE_UNUSED)136*7c568831SAndroid Build Coastguard Worker xmlReallocLoc(void *ptr, size_t size, const char *file ATTRIBUTE_UNUSED,
137*7c568831SAndroid Build Coastguard Worker               int line ATTRIBUTE_UNUSED)
138*7c568831SAndroid Build Coastguard Worker {
139*7c568831SAndroid Build Coastguard Worker     return(xmlMemRealloc(ptr, size));
140*7c568831SAndroid Build Coastguard Worker }
141*7c568831SAndroid Build Coastguard Worker 
142*7c568831SAndroid Build Coastguard Worker /**
143*7c568831SAndroid Build Coastguard Worker  * xmlMemRealloc:
144*7c568831SAndroid Build Coastguard Worker  * @ptr:  the initial memory block pointer
145*7c568831SAndroid Build Coastguard Worker  * @size:  an int specifying the size in byte to allocate.
146*7c568831SAndroid Build Coastguard Worker  *
147*7c568831SAndroid Build Coastguard Worker  * a realloc() equivalent, with logging of the allocation info.
148*7c568831SAndroid Build Coastguard Worker  *
149*7c568831SAndroid Build Coastguard Worker  * Returns a pointer to the allocated area or NULL in case of lack of memory.
150*7c568831SAndroid Build Coastguard Worker  */
151*7c568831SAndroid Build Coastguard Worker void *
xmlMemRealloc(void * ptr,size_t size)152*7c568831SAndroid Build Coastguard Worker xmlMemRealloc(void *ptr, size_t size) {
153*7c568831SAndroid Build Coastguard Worker     MEMHDR *p, *tmp;
154*7c568831SAndroid Build Coastguard Worker     size_t oldSize;
155*7c568831SAndroid Build Coastguard Worker 
156*7c568831SAndroid Build Coastguard Worker     if (ptr == NULL)
157*7c568831SAndroid Build Coastguard Worker         return(xmlMemMalloc(size));
158*7c568831SAndroid Build Coastguard Worker 
159*7c568831SAndroid Build Coastguard Worker     xmlInitParser();
160*7c568831SAndroid Build Coastguard Worker 
161*7c568831SAndroid Build Coastguard Worker     if (size > (MAX_SIZE_T - RESERVE_SIZE))
162*7c568831SAndroid Build Coastguard Worker         return(NULL);
163*7c568831SAndroid Build Coastguard Worker 
164*7c568831SAndroid Build Coastguard Worker     p = CLIENT_2_HDR(ptr);
165*7c568831SAndroid Build Coastguard Worker     if (p->mh_tag != MEMTAG) {
166*7c568831SAndroid Build Coastguard Worker         xmlPrintErrorMessage("xmlMemRealloc: Tag error\n");
167*7c568831SAndroid Build Coastguard Worker         return(NULL);
168*7c568831SAndroid Build Coastguard Worker     }
169*7c568831SAndroid Build Coastguard Worker     oldSize = p->mh_size;
170*7c568831SAndroid Build Coastguard Worker     p->mh_tag = ~MEMTAG;
171*7c568831SAndroid Build Coastguard Worker 
172*7c568831SAndroid Build Coastguard Worker     tmp = (MEMHDR *) realloc(p, RESERVE_SIZE + size);
173*7c568831SAndroid Build Coastguard Worker     if (!tmp) {
174*7c568831SAndroid Build Coastguard Worker         p->mh_tag = MEMTAG;
175*7c568831SAndroid Build Coastguard Worker         return(NULL);
176*7c568831SAndroid Build Coastguard Worker     }
177*7c568831SAndroid Build Coastguard Worker     p = tmp;
178*7c568831SAndroid Build Coastguard Worker     p->mh_tag = MEMTAG;
179*7c568831SAndroid Build Coastguard Worker     p->mh_size = size;
180*7c568831SAndroid Build Coastguard Worker 
181*7c568831SAndroid Build Coastguard Worker     xmlMutexLock(&xmlMemMutex);
182*7c568831SAndroid Build Coastguard Worker     debugMemSize -= oldSize;
183*7c568831SAndroid Build Coastguard Worker     debugMemSize += size;
184*7c568831SAndroid Build Coastguard Worker     xmlMutexUnlock(&xmlMemMutex);
185*7c568831SAndroid Build Coastguard Worker 
186*7c568831SAndroid Build Coastguard Worker     return(HDR_2_CLIENT(p));
187*7c568831SAndroid Build Coastguard Worker }
188*7c568831SAndroid Build Coastguard Worker 
189*7c568831SAndroid Build Coastguard Worker /**
190*7c568831SAndroid Build Coastguard Worker  * xmlMemFree:
191*7c568831SAndroid Build Coastguard Worker  * @ptr:  the memory block pointer
192*7c568831SAndroid Build Coastguard Worker  *
193*7c568831SAndroid Build Coastguard Worker  * a free() equivalent, with error checking.
194*7c568831SAndroid Build Coastguard Worker  */
195*7c568831SAndroid Build Coastguard Worker void
xmlMemFree(void * ptr)196*7c568831SAndroid Build Coastguard Worker xmlMemFree(void *ptr)
197*7c568831SAndroid Build Coastguard Worker {
198*7c568831SAndroid Build Coastguard Worker     MEMHDR *p;
199*7c568831SAndroid Build Coastguard Worker 
200*7c568831SAndroid Build Coastguard Worker     if (ptr == NULL)
201*7c568831SAndroid Build Coastguard Worker         return;
202*7c568831SAndroid Build Coastguard Worker 
203*7c568831SAndroid Build Coastguard Worker     if (ptr == (void *) -1) {
204*7c568831SAndroid Build Coastguard Worker         xmlPrintErrorMessage("xmlMemFree: Pointer from freed area\n");
205*7c568831SAndroid Build Coastguard Worker         return;
206*7c568831SAndroid Build Coastguard Worker     }
207*7c568831SAndroid Build Coastguard Worker 
208*7c568831SAndroid Build Coastguard Worker     p = CLIENT_2_HDR(ptr);
209*7c568831SAndroid Build Coastguard Worker     if (p->mh_tag != MEMTAG) {
210*7c568831SAndroid Build Coastguard Worker         xmlPrintErrorMessage("xmlMemFree: Tag error\n");
211*7c568831SAndroid Build Coastguard Worker         return;
212*7c568831SAndroid Build Coastguard Worker     }
213*7c568831SAndroid Build Coastguard Worker     p->mh_tag = ~MEMTAG;
214*7c568831SAndroid Build Coastguard Worker     memset(ptr, -1, p->mh_size);
215*7c568831SAndroid Build Coastguard Worker 
216*7c568831SAndroid Build Coastguard Worker     xmlMutexLock(&xmlMemMutex);
217*7c568831SAndroid Build Coastguard Worker     debugMemSize -= p->mh_size;
218*7c568831SAndroid Build Coastguard Worker     debugMemBlocks--;
219*7c568831SAndroid Build Coastguard Worker     xmlMutexUnlock(&xmlMemMutex);
220*7c568831SAndroid Build Coastguard Worker 
221*7c568831SAndroid Build Coastguard Worker     free(p);
222*7c568831SAndroid Build Coastguard Worker }
223*7c568831SAndroid Build Coastguard Worker 
224*7c568831SAndroid Build Coastguard Worker /**
225*7c568831SAndroid Build Coastguard Worker  * xmlMemStrdupLoc:
226*7c568831SAndroid Build Coastguard Worker  * @str:  the initial string pointer
227*7c568831SAndroid Build Coastguard Worker  * @file:  the file name or NULL
228*7c568831SAndroid Build Coastguard Worker  * @line:  the line number
229*7c568831SAndroid Build Coastguard Worker  *
230*7c568831SAndroid Build Coastguard Worker  * DEPRECATED: don't use
231*7c568831SAndroid Build Coastguard Worker  *
232*7c568831SAndroid Build Coastguard Worker  * Returns a pointer to the new string or NULL if allocation error occurred.
233*7c568831SAndroid Build Coastguard Worker  */
234*7c568831SAndroid Build Coastguard Worker char *
xmlMemStrdupLoc(const char * str,const char * file ATTRIBUTE_UNUSED,int line ATTRIBUTE_UNUSED)235*7c568831SAndroid Build Coastguard Worker xmlMemStrdupLoc(const char *str, const char *file ATTRIBUTE_UNUSED,
236*7c568831SAndroid Build Coastguard Worker                 int line ATTRIBUTE_UNUSED)
237*7c568831SAndroid Build Coastguard Worker {
238*7c568831SAndroid Build Coastguard Worker     return(xmlMemoryStrdup(str));
239*7c568831SAndroid Build Coastguard Worker }
240*7c568831SAndroid Build Coastguard Worker 
241*7c568831SAndroid Build Coastguard Worker /**
242*7c568831SAndroid Build Coastguard Worker  * xmlMemoryStrdup:
243*7c568831SAndroid Build Coastguard Worker  * @str:  the initial string pointer
244*7c568831SAndroid Build Coastguard Worker  *
245*7c568831SAndroid Build Coastguard Worker  * a strdup() equivalent, with logging of the allocation info.
246*7c568831SAndroid Build Coastguard Worker  *
247*7c568831SAndroid Build Coastguard Worker  * Returns a pointer to the new string or NULL if allocation error occurred.
248*7c568831SAndroid Build Coastguard Worker  */
249*7c568831SAndroid Build Coastguard Worker char *
xmlMemoryStrdup(const char * str)250*7c568831SAndroid Build Coastguard Worker xmlMemoryStrdup(const char *str) {
251*7c568831SAndroid Build Coastguard Worker     char *s;
252*7c568831SAndroid Build Coastguard Worker     size_t size = strlen(str) + 1;
253*7c568831SAndroid Build Coastguard Worker     MEMHDR *p;
254*7c568831SAndroid Build Coastguard Worker 
255*7c568831SAndroid Build Coastguard Worker     xmlInitParser();
256*7c568831SAndroid Build Coastguard Worker 
257*7c568831SAndroid Build Coastguard Worker     if (size > (MAX_SIZE_T - RESERVE_SIZE))
258*7c568831SAndroid Build Coastguard Worker         return(NULL);
259*7c568831SAndroid Build Coastguard Worker 
260*7c568831SAndroid Build Coastguard Worker     p = (MEMHDR *) malloc(RESERVE_SIZE + size);
261*7c568831SAndroid Build Coastguard Worker     if (!p)
262*7c568831SAndroid Build Coastguard Worker         return(NULL);
263*7c568831SAndroid Build Coastguard Worker     p->mh_tag = MEMTAG;
264*7c568831SAndroid Build Coastguard Worker     p->mh_size = size;
265*7c568831SAndroid Build Coastguard Worker 
266*7c568831SAndroid Build Coastguard Worker     xmlMutexLock(&xmlMemMutex);
267*7c568831SAndroid Build Coastguard Worker     debugMemSize += size;
268*7c568831SAndroid Build Coastguard Worker     debugMemBlocks++;
269*7c568831SAndroid Build Coastguard Worker     xmlMutexUnlock(&xmlMemMutex);
270*7c568831SAndroid Build Coastguard Worker 
271*7c568831SAndroid Build Coastguard Worker     s = (char *) HDR_2_CLIENT(p);
272*7c568831SAndroid Build Coastguard Worker 
273*7c568831SAndroid Build Coastguard Worker     memcpy(s, str, size);
274*7c568831SAndroid Build Coastguard Worker 
275*7c568831SAndroid Build Coastguard Worker     return(s);
276*7c568831SAndroid Build Coastguard Worker }
277*7c568831SAndroid Build Coastguard Worker 
278*7c568831SAndroid Build Coastguard Worker /**
279*7c568831SAndroid Build Coastguard Worker  * xmlMemSize:
280*7c568831SAndroid Build Coastguard Worker  * @ptr:  pointer to the memory allocation
281*7c568831SAndroid Build Coastguard Worker  *
282*7c568831SAndroid Build Coastguard Worker  * Returns the size of a memory allocation.
283*7c568831SAndroid Build Coastguard Worker  */
284*7c568831SAndroid Build Coastguard Worker 
285*7c568831SAndroid Build Coastguard Worker size_t
xmlMemSize(void * ptr)286*7c568831SAndroid Build Coastguard Worker xmlMemSize(void *ptr) {
287*7c568831SAndroid Build Coastguard Worker     MEMHDR *p;
288*7c568831SAndroid Build Coastguard Worker 
289*7c568831SAndroid Build Coastguard Worker     if (ptr == NULL)
290*7c568831SAndroid Build Coastguard Worker 	return(0);
291*7c568831SAndroid Build Coastguard Worker 
292*7c568831SAndroid Build Coastguard Worker     p = CLIENT_2_HDR(ptr);
293*7c568831SAndroid Build Coastguard Worker     if (p->mh_tag != MEMTAG)
294*7c568831SAndroid Build Coastguard Worker         return(0);
295*7c568831SAndroid Build Coastguard Worker 
296*7c568831SAndroid Build Coastguard Worker     return(p->mh_size);
297*7c568831SAndroid Build Coastguard Worker }
298*7c568831SAndroid Build Coastguard Worker 
299*7c568831SAndroid Build Coastguard Worker /**
300*7c568831SAndroid Build Coastguard Worker  * xmlMemUsed:
301*7c568831SAndroid Build Coastguard Worker  *
302*7c568831SAndroid Build Coastguard Worker  * Provides the amount of memory currently allocated
303*7c568831SAndroid Build Coastguard Worker  *
304*7c568831SAndroid Build Coastguard Worker  * Returns an int representing the amount of memory allocated.
305*7c568831SAndroid Build Coastguard Worker  */
306*7c568831SAndroid Build Coastguard Worker 
307*7c568831SAndroid Build Coastguard Worker int
xmlMemUsed(void)308*7c568831SAndroid Build Coastguard Worker xmlMemUsed(void) {
309*7c568831SAndroid Build Coastguard Worker     return(debugMemSize);
310*7c568831SAndroid Build Coastguard Worker }
311*7c568831SAndroid Build Coastguard Worker 
312*7c568831SAndroid Build Coastguard Worker /**
313*7c568831SAndroid Build Coastguard Worker  * xmlMemBlocks:
314*7c568831SAndroid Build Coastguard Worker  *
315*7c568831SAndroid Build Coastguard Worker  * Provides the number of memory areas currently allocated
316*7c568831SAndroid Build Coastguard Worker  *
317*7c568831SAndroid Build Coastguard Worker  * Returns an int representing the number of blocks
318*7c568831SAndroid Build Coastguard Worker  */
319*7c568831SAndroid Build Coastguard Worker 
320*7c568831SAndroid Build Coastguard Worker int
xmlMemBlocks(void)321*7c568831SAndroid Build Coastguard Worker xmlMemBlocks(void) {
322*7c568831SAndroid Build Coastguard Worker     int res;
323*7c568831SAndroid Build Coastguard Worker 
324*7c568831SAndroid Build Coastguard Worker     xmlMutexLock(&xmlMemMutex);
325*7c568831SAndroid Build Coastguard Worker     res = debugMemBlocks;
326*7c568831SAndroid Build Coastguard Worker     xmlMutexUnlock(&xmlMemMutex);
327*7c568831SAndroid Build Coastguard Worker     return(res);
328*7c568831SAndroid Build Coastguard Worker }
329*7c568831SAndroid Build Coastguard Worker 
330*7c568831SAndroid Build Coastguard Worker /**
331*7c568831SAndroid Build Coastguard Worker  * xmlMemDisplayLast:
332*7c568831SAndroid Build Coastguard Worker  * @fp:  a FILE descriptor
333*7c568831SAndroid Build Coastguard Worker  * @nbBytes: the amount of memory to dump
334*7c568831SAndroid Build Coastguard Worker  *
335*7c568831SAndroid Build Coastguard Worker  * DEPRECATED: This feature was removed.
336*7c568831SAndroid Build Coastguard Worker  */
337*7c568831SAndroid Build Coastguard Worker void
xmlMemDisplayLast(FILE * fp ATTRIBUTE_UNUSED,long nbBytes ATTRIBUTE_UNUSED)338*7c568831SAndroid Build Coastguard Worker xmlMemDisplayLast(FILE *fp ATTRIBUTE_UNUSED, long nbBytes ATTRIBUTE_UNUSED)
339*7c568831SAndroid Build Coastguard Worker {
340*7c568831SAndroid Build Coastguard Worker }
341*7c568831SAndroid Build Coastguard Worker 
342*7c568831SAndroid Build Coastguard Worker /**
343*7c568831SAndroid Build Coastguard Worker  * xmlMemDisplay:
344*7c568831SAndroid Build Coastguard Worker  * @fp:  a FILE descriptor
345*7c568831SAndroid Build Coastguard Worker  *
346*7c568831SAndroid Build Coastguard Worker  * DEPRECATED: This feature was removed.
347*7c568831SAndroid Build Coastguard Worker  */
348*7c568831SAndroid Build Coastguard Worker void
xmlMemDisplay(FILE * fp ATTRIBUTE_UNUSED)349*7c568831SAndroid Build Coastguard Worker xmlMemDisplay(FILE *fp ATTRIBUTE_UNUSED)
350*7c568831SAndroid Build Coastguard Worker {
351*7c568831SAndroid Build Coastguard Worker }
352*7c568831SAndroid Build Coastguard Worker 
353*7c568831SAndroid Build Coastguard Worker /**
354*7c568831SAndroid Build Coastguard Worker  * xmlMemShow:
355*7c568831SAndroid Build Coastguard Worker  * @fp:  a FILE descriptor
356*7c568831SAndroid Build Coastguard Worker  * @nr:  number of entries to dump
357*7c568831SAndroid Build Coastguard Worker  *
358*7c568831SAndroid Build Coastguard Worker  * DEPRECATED: This feature was removed.
359*7c568831SAndroid Build Coastguard Worker  */
360*7c568831SAndroid Build Coastguard Worker void
xmlMemShow(FILE * fp ATTRIBUTE_UNUSED,int nr ATTRIBUTE_UNUSED)361*7c568831SAndroid Build Coastguard Worker xmlMemShow(FILE *fp ATTRIBUTE_UNUSED, int nr ATTRIBUTE_UNUSED)
362*7c568831SAndroid Build Coastguard Worker {
363*7c568831SAndroid Build Coastguard Worker }
364*7c568831SAndroid Build Coastguard Worker 
365*7c568831SAndroid Build Coastguard Worker /**
366*7c568831SAndroid Build Coastguard Worker  * xmlMemoryDump:
367*7c568831SAndroid Build Coastguard Worker  *
368*7c568831SAndroid Build Coastguard Worker  * DEPRECATED: This feature was removed.
369*7c568831SAndroid Build Coastguard Worker  */
370*7c568831SAndroid Build Coastguard Worker void
xmlMemoryDump(void)371*7c568831SAndroid Build Coastguard Worker xmlMemoryDump(void)
372*7c568831SAndroid Build Coastguard Worker {
373*7c568831SAndroid Build Coastguard Worker }
374*7c568831SAndroid Build Coastguard Worker 
375*7c568831SAndroid Build Coastguard Worker 
376*7c568831SAndroid Build Coastguard Worker /****************************************************************
377*7c568831SAndroid Build Coastguard Worker  *								*
378*7c568831SAndroid Build Coastguard Worker  *		Initialization Routines				*
379*7c568831SAndroid Build Coastguard Worker  *								*
380*7c568831SAndroid Build Coastguard Worker  ****************************************************************/
381*7c568831SAndroid Build Coastguard Worker 
382*7c568831SAndroid Build Coastguard Worker /**
383*7c568831SAndroid Build Coastguard Worker  * xmlInitMemory:
384*7c568831SAndroid Build Coastguard Worker  *
385*7c568831SAndroid Build Coastguard Worker  * DEPRECATED: Alias for xmlInitParser.
386*7c568831SAndroid Build Coastguard Worker  *
387*7c568831SAndroid Build Coastguard Worker  * Returns 0.
388*7c568831SAndroid Build Coastguard Worker  */
389*7c568831SAndroid Build Coastguard Worker int
xmlInitMemory(void)390*7c568831SAndroid Build Coastguard Worker xmlInitMemory(void) {
391*7c568831SAndroid Build Coastguard Worker     xmlInitParser();
392*7c568831SAndroid Build Coastguard Worker     return(0);
393*7c568831SAndroid Build Coastguard Worker }
394*7c568831SAndroid Build Coastguard Worker 
395*7c568831SAndroid Build Coastguard Worker /**
396*7c568831SAndroid Build Coastguard Worker  * xmlInitMemoryInternal:
397*7c568831SAndroid Build Coastguard Worker  *
398*7c568831SAndroid Build Coastguard Worker  * Initialize the memory layer.
399*7c568831SAndroid Build Coastguard Worker  */
400*7c568831SAndroid Build Coastguard Worker void
xmlInitMemoryInternal(void)401*7c568831SAndroid Build Coastguard Worker xmlInitMemoryInternal(void) {
402*7c568831SAndroid Build Coastguard Worker     xmlInitMutex(&xmlMemMutex);
403*7c568831SAndroid Build Coastguard Worker }
404*7c568831SAndroid Build Coastguard Worker 
405*7c568831SAndroid Build Coastguard Worker /**
406*7c568831SAndroid Build Coastguard Worker  * xmlCleanupMemory:
407*7c568831SAndroid Build Coastguard Worker  *
408*7c568831SAndroid Build Coastguard Worker  * DEPRECATED: This function is a no-op. Call xmlCleanupParser
409*7c568831SAndroid Build Coastguard Worker  * to free global state but see the warnings there. xmlCleanupParser
410*7c568831SAndroid Build Coastguard Worker  * should be only called once at program exit. In most cases, you don't
411*7c568831SAndroid Build Coastguard Worker  * have call cleanup functions at all.
412*7c568831SAndroid Build Coastguard Worker  */
413*7c568831SAndroid Build Coastguard Worker void
xmlCleanupMemory(void)414*7c568831SAndroid Build Coastguard Worker xmlCleanupMemory(void) {
415*7c568831SAndroid Build Coastguard Worker }
416*7c568831SAndroid Build Coastguard Worker 
417*7c568831SAndroid Build Coastguard Worker /**
418*7c568831SAndroid Build Coastguard Worker  * xmlCleanupMemoryInternal:
419*7c568831SAndroid Build Coastguard Worker  *
420*7c568831SAndroid Build Coastguard Worker  * Free up all the memory allocated by the library for its own
421*7c568831SAndroid Build Coastguard Worker  * use. This should not be called by user level code.
422*7c568831SAndroid Build Coastguard Worker  */
423*7c568831SAndroid Build Coastguard Worker void
xmlCleanupMemoryInternal(void)424*7c568831SAndroid Build Coastguard Worker xmlCleanupMemoryInternal(void) {
425*7c568831SAndroid Build Coastguard Worker     /*
426*7c568831SAndroid Build Coastguard Worker      * Don't clean up mutex on Windows. Global state destructors can call
427*7c568831SAndroid Build Coastguard Worker      * malloc functions after xmlCleanupParser was called. If memory
428*7c568831SAndroid Build Coastguard Worker      * debugging is enabled, xmlMemMutex can be used after cleanup.
429*7c568831SAndroid Build Coastguard Worker      *
430*7c568831SAndroid Build Coastguard Worker      * See python/tests/thread2.py
431*7c568831SAndroid Build Coastguard Worker      */
432*7c568831SAndroid Build Coastguard Worker #if !defined(LIBXML_THREAD_ENABLED) || !defined(_WIN32)
433*7c568831SAndroid Build Coastguard Worker     xmlCleanupMutex(&xmlMemMutex);
434*7c568831SAndroid Build Coastguard Worker #endif
435*7c568831SAndroid Build Coastguard Worker }
436*7c568831SAndroid Build Coastguard Worker 
437*7c568831SAndroid Build Coastguard Worker /**
438*7c568831SAndroid Build Coastguard Worker  * xmlMemSetup:
439*7c568831SAndroid Build Coastguard Worker  * @freeFunc: the free() function to use
440*7c568831SAndroid Build Coastguard Worker  * @mallocFunc: the malloc() function to use
441*7c568831SAndroid Build Coastguard Worker  * @reallocFunc: the realloc() function to use
442*7c568831SAndroid Build Coastguard Worker  * @strdupFunc: the strdup() function to use
443*7c568831SAndroid Build Coastguard Worker  *
444*7c568831SAndroid Build Coastguard Worker  * Override the default memory access functions with a new set
445*7c568831SAndroid Build Coastguard Worker  * This has to be called before any other libxml routines !
446*7c568831SAndroid Build Coastguard Worker  *
447*7c568831SAndroid Build Coastguard Worker  * Should this be blocked if there was already some allocations
448*7c568831SAndroid Build Coastguard Worker  * done ?
449*7c568831SAndroid Build Coastguard Worker  *
450*7c568831SAndroid Build Coastguard Worker  * Returns 0 on success
451*7c568831SAndroid Build Coastguard Worker  */
452*7c568831SAndroid Build Coastguard Worker int
xmlMemSetup(xmlFreeFunc freeFunc,xmlMallocFunc mallocFunc,xmlReallocFunc reallocFunc,xmlStrdupFunc strdupFunc)453*7c568831SAndroid Build Coastguard Worker xmlMemSetup(xmlFreeFunc freeFunc, xmlMallocFunc mallocFunc,
454*7c568831SAndroid Build Coastguard Worker             xmlReallocFunc reallocFunc, xmlStrdupFunc strdupFunc) {
455*7c568831SAndroid Build Coastguard Worker     if (freeFunc == NULL)
456*7c568831SAndroid Build Coastguard Worker 	return(-1);
457*7c568831SAndroid Build Coastguard Worker     if (mallocFunc == NULL)
458*7c568831SAndroid Build Coastguard Worker 	return(-1);
459*7c568831SAndroid Build Coastguard Worker     if (reallocFunc == NULL)
460*7c568831SAndroid Build Coastguard Worker 	return(-1);
461*7c568831SAndroid Build Coastguard Worker     if (strdupFunc == NULL)
462*7c568831SAndroid Build Coastguard Worker 	return(-1);
463*7c568831SAndroid Build Coastguard Worker     xmlFree = freeFunc;
464*7c568831SAndroid Build Coastguard Worker     xmlMalloc = mallocFunc;
465*7c568831SAndroid Build Coastguard Worker     xmlMallocAtomic = mallocFunc;
466*7c568831SAndroid Build Coastguard Worker     xmlRealloc = reallocFunc;
467*7c568831SAndroid Build Coastguard Worker     xmlMemStrdup = strdupFunc;
468*7c568831SAndroid Build Coastguard Worker     return(0);
469*7c568831SAndroid Build Coastguard Worker }
470*7c568831SAndroid Build Coastguard Worker 
471*7c568831SAndroid Build Coastguard Worker /**
472*7c568831SAndroid Build Coastguard Worker  * xmlMemGet:
473*7c568831SAndroid Build Coastguard Worker  * @freeFunc: place to save the free() function in use
474*7c568831SAndroid Build Coastguard Worker  * @mallocFunc: place to save the malloc() function in use
475*7c568831SAndroid Build Coastguard Worker  * @reallocFunc: place to save the realloc() function in use
476*7c568831SAndroid Build Coastguard Worker  * @strdupFunc: place to save the strdup() function in use
477*7c568831SAndroid Build Coastguard Worker  *
478*7c568831SAndroid Build Coastguard Worker  * Provides the memory access functions set currently in use
479*7c568831SAndroid Build Coastguard Worker  *
480*7c568831SAndroid Build Coastguard Worker  * Returns 0 on success
481*7c568831SAndroid Build Coastguard Worker  */
482*7c568831SAndroid Build Coastguard Worker int
xmlMemGet(xmlFreeFunc * freeFunc,xmlMallocFunc * mallocFunc,xmlReallocFunc * reallocFunc,xmlStrdupFunc * strdupFunc)483*7c568831SAndroid Build Coastguard Worker xmlMemGet(xmlFreeFunc *freeFunc, xmlMallocFunc *mallocFunc,
484*7c568831SAndroid Build Coastguard Worker 	  xmlReallocFunc *reallocFunc, xmlStrdupFunc *strdupFunc) {
485*7c568831SAndroid Build Coastguard Worker     if (freeFunc != NULL) *freeFunc = xmlFree;
486*7c568831SAndroid Build Coastguard Worker     if (mallocFunc != NULL) *mallocFunc = xmlMalloc;
487*7c568831SAndroid Build Coastguard Worker     if (reallocFunc != NULL) *reallocFunc = xmlRealloc;
488*7c568831SAndroid Build Coastguard Worker     if (strdupFunc != NULL) *strdupFunc = xmlMemStrdup;
489*7c568831SAndroid Build Coastguard Worker     return(0);
490*7c568831SAndroid Build Coastguard Worker }
491*7c568831SAndroid Build Coastguard Worker 
492*7c568831SAndroid Build Coastguard Worker /**
493*7c568831SAndroid Build Coastguard Worker  * xmlGcMemSetup:
494*7c568831SAndroid Build Coastguard Worker  * @freeFunc: the free() function to use
495*7c568831SAndroid Build Coastguard Worker  * @mallocFunc: the malloc() function to use
496*7c568831SAndroid Build Coastguard Worker  * @mallocAtomicFunc: the malloc() function to use for atomic allocations
497*7c568831SAndroid Build Coastguard Worker  * @reallocFunc: the realloc() function to use
498*7c568831SAndroid Build Coastguard Worker  * @strdupFunc: the strdup() function to use
499*7c568831SAndroid Build Coastguard Worker  *
500*7c568831SAndroid Build Coastguard Worker  * DEPRECATED: Use xmlMemSetup.
501*7c568831SAndroid Build Coastguard Worker  *
502*7c568831SAndroid Build Coastguard Worker  * Override the default memory access functions with a new set
503*7c568831SAndroid Build Coastguard Worker  * This has to be called before any other libxml routines !
504*7c568831SAndroid Build Coastguard Worker  * The mallocAtomicFunc is specialized for atomic block
505*7c568831SAndroid Build Coastguard Worker  * allocations (i.e. of areas  useful for garbage collected memory allocators
506*7c568831SAndroid Build Coastguard Worker  *
507*7c568831SAndroid Build Coastguard Worker  * Should this be blocked if there was already some allocations
508*7c568831SAndroid Build Coastguard Worker  * done ?
509*7c568831SAndroid Build Coastguard Worker  *
510*7c568831SAndroid Build Coastguard Worker  * Returns 0 on success
511*7c568831SAndroid Build Coastguard Worker  */
512*7c568831SAndroid Build Coastguard Worker int
xmlGcMemSetup(xmlFreeFunc freeFunc,xmlMallocFunc mallocFunc,xmlMallocFunc mallocAtomicFunc,xmlReallocFunc reallocFunc,xmlStrdupFunc strdupFunc)513*7c568831SAndroid Build Coastguard Worker xmlGcMemSetup(xmlFreeFunc freeFunc, xmlMallocFunc mallocFunc,
514*7c568831SAndroid Build Coastguard Worker               xmlMallocFunc mallocAtomicFunc, xmlReallocFunc reallocFunc,
515*7c568831SAndroid Build Coastguard Worker 	      xmlStrdupFunc strdupFunc) {
516*7c568831SAndroid Build Coastguard Worker     if (freeFunc == NULL)
517*7c568831SAndroid Build Coastguard Worker 	return(-1);
518*7c568831SAndroid Build Coastguard Worker     if (mallocFunc == NULL)
519*7c568831SAndroid Build Coastguard Worker 	return(-1);
520*7c568831SAndroid Build Coastguard Worker     if (mallocAtomicFunc == NULL)
521*7c568831SAndroid Build Coastguard Worker 	return(-1);
522*7c568831SAndroid Build Coastguard Worker     if (reallocFunc == NULL)
523*7c568831SAndroid Build Coastguard Worker 	return(-1);
524*7c568831SAndroid Build Coastguard Worker     if (strdupFunc == NULL)
525*7c568831SAndroid Build Coastguard Worker 	return(-1);
526*7c568831SAndroid Build Coastguard Worker     xmlFree = freeFunc;
527*7c568831SAndroid Build Coastguard Worker     xmlMalloc = mallocFunc;
528*7c568831SAndroid Build Coastguard Worker     xmlMallocAtomic = mallocAtomicFunc;
529*7c568831SAndroid Build Coastguard Worker     xmlRealloc = reallocFunc;
530*7c568831SAndroid Build Coastguard Worker     xmlMemStrdup = strdupFunc;
531*7c568831SAndroid Build Coastguard Worker     return(0);
532*7c568831SAndroid Build Coastguard Worker }
533*7c568831SAndroid Build Coastguard Worker 
534*7c568831SAndroid Build Coastguard Worker /**
535*7c568831SAndroid Build Coastguard Worker  * xmlGcMemGet:
536*7c568831SAndroid Build Coastguard Worker  * @freeFunc: place to save the free() function in use
537*7c568831SAndroid Build Coastguard Worker  * @mallocFunc: place to save the malloc() function in use
538*7c568831SAndroid Build Coastguard Worker  * @mallocAtomicFunc: place to save the atomic malloc() function in use
539*7c568831SAndroid Build Coastguard Worker  * @reallocFunc: place to save the realloc() function in use
540*7c568831SAndroid Build Coastguard Worker  * @strdupFunc: place to save the strdup() function in use
541*7c568831SAndroid Build Coastguard Worker  *
542*7c568831SAndroid Build Coastguard Worker  * DEPRECATED: xmlMemGet.
543*7c568831SAndroid Build Coastguard Worker  *
544*7c568831SAndroid Build Coastguard Worker  * Provides the memory access functions set currently in use
545*7c568831SAndroid Build Coastguard Worker  * The mallocAtomicFunc is specialized for atomic block
546*7c568831SAndroid Build Coastguard Worker  * allocations (i.e. of areas  useful for garbage collected memory allocators
547*7c568831SAndroid Build Coastguard Worker  *
548*7c568831SAndroid Build Coastguard Worker  * Returns 0 on success
549*7c568831SAndroid Build Coastguard Worker  */
550*7c568831SAndroid Build Coastguard Worker int
xmlGcMemGet(xmlFreeFunc * freeFunc,xmlMallocFunc * mallocFunc,xmlMallocFunc * mallocAtomicFunc,xmlReallocFunc * reallocFunc,xmlStrdupFunc * strdupFunc)551*7c568831SAndroid Build Coastguard Worker xmlGcMemGet(xmlFreeFunc *freeFunc, xmlMallocFunc *mallocFunc,
552*7c568831SAndroid Build Coastguard Worker             xmlMallocFunc *mallocAtomicFunc, xmlReallocFunc *reallocFunc,
553*7c568831SAndroid Build Coastguard Worker 	    xmlStrdupFunc *strdupFunc) {
554*7c568831SAndroid Build Coastguard Worker     if (freeFunc != NULL) *freeFunc = xmlFree;
555*7c568831SAndroid Build Coastguard Worker     if (mallocFunc != NULL) *mallocFunc = xmlMalloc;
556*7c568831SAndroid Build Coastguard Worker     if (mallocAtomicFunc != NULL) *mallocAtomicFunc = xmlMallocAtomic;
557*7c568831SAndroid Build Coastguard Worker     if (reallocFunc != NULL) *reallocFunc = xmlRealloc;
558*7c568831SAndroid Build Coastguard Worker     if (strdupFunc != NULL) *strdupFunc = xmlMemStrdup;
559*7c568831SAndroid Build Coastguard Worker     return(0);
560*7c568831SAndroid Build Coastguard Worker }
561*7c568831SAndroid Build Coastguard Worker 
562