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