OLD | NEW |
1 /* | 1 /* |
2 * xmlmemory.c: libxml memory allocator wrapper. | 2 * xmlmemory.c: libxml memory allocator wrapper. |
3 * | 3 * |
4 * daniel@veillard.com | 4 * daniel@veillard.com |
5 */ | 5 */ |
6 | 6 |
7 #define IN_LIBXML | 7 #define IN_LIBXML |
8 #include "libxml.h" | 8 #include "libxml.h" |
9 | 9 |
10 #include <string.h> | 10 #include <string.h> |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
51 static int xmlMemInitialized = 0; | 51 static int xmlMemInitialized = 0; |
52 static unsigned long debugMemSize = 0; | 52 static unsigned long debugMemSize = 0; |
53 static unsigned long debugMemBlocks = 0; | 53 static unsigned long debugMemBlocks = 0; |
54 static unsigned long debugMaxMemSize = 0; | 54 static unsigned long debugMaxMemSize = 0; |
55 static xmlMutexPtr xmlMemMutex = NULL; | 55 static xmlMutexPtr xmlMemMutex = NULL; |
56 | 56 |
57 void xmlMallocBreakpoint(void); | 57 void xmlMallocBreakpoint(void); |
58 | 58 |
59 /************************************************************************ | 59 /************************************************************************ |
60 * * | 60 * * |
61 * » » Macros, variables and associated types» » » * | 61 *» » Macros, variables and associated types» » » * |
62 * * | 62 * * |
63 ************************************************************************/ | 63 ************************************************************************/ |
64 | 64 |
65 #if !defined(LIBXML_THREAD_ENABLED) && !defined(LIBXML_THREAD_ALLOC_ENABLED) | 65 #if !defined(LIBXML_THREAD_ENABLED) && !defined(LIBXML_THREAD_ALLOC_ENABLED) |
66 #ifdef xmlMalloc | 66 #ifdef xmlMalloc |
67 #undef xmlMalloc | 67 #undef xmlMalloc |
68 #endif | 68 #endif |
69 #ifdef xmlRealloc | 69 #ifdef xmlRealloc |
70 #undef xmlRealloc | 70 #undef xmlRealloc |
71 #endif | 71 #endif |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 xmlGenericError(xmlGenericErrorContext, | 198 xmlGenericError(xmlGenericErrorContext, |
199 "Malloc(%d) Ok\n",size); | 199 "Malloc(%d) Ok\n",size); |
200 #endif | 200 #endif |
201 | 201 |
202 if (xmlMemStopAtBlock == p->mh_number) xmlMallocBreakpoint(); | 202 if (xmlMemStopAtBlock == p->mh_number) xmlMallocBreakpoint(); |
203 | 203 |
204 ret = HDR_2_CLIENT(p); | 204 ret = HDR_2_CLIENT(p); |
205 | 205 |
206 if (xmlMemTraceBlockAt == ret) { | 206 if (xmlMemTraceBlockAt == ret) { |
207 xmlGenericError(xmlGenericErrorContext, | 207 xmlGenericError(xmlGenericErrorContext, |
208 » » » "%p : Malloc(%ld) Ok\n", xmlMemTraceBlockAt, size); | 208 » » » "%p : Malloc(%lu) Ok\n", xmlMemTraceBlockAt, |
| 209 » » » (long unsigned)size); |
209 xmlMallocBreakpoint(); | 210 xmlMallocBreakpoint(); |
210 } | 211 } |
211 | 212 |
212 TEST_POINT | 213 TEST_POINT |
213 | 214 |
214 return(ret); | 215 return(ret); |
215 } | 216 } |
216 | 217 |
217 /** | 218 /** |
218 * xmlMallocAtomicLoc: | 219 * xmlMallocAtomicLoc: |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 xmlGenericError(xmlGenericErrorContext, | 267 xmlGenericError(xmlGenericErrorContext, |
267 "Malloc(%d) Ok\n",size); | 268 "Malloc(%d) Ok\n",size); |
268 #endif | 269 #endif |
269 | 270 |
270 if (xmlMemStopAtBlock == p->mh_number) xmlMallocBreakpoint(); | 271 if (xmlMemStopAtBlock == p->mh_number) xmlMallocBreakpoint(); |
271 | 272 |
272 ret = HDR_2_CLIENT(p); | 273 ret = HDR_2_CLIENT(p); |
273 | 274 |
274 if (xmlMemTraceBlockAt == ret) { | 275 if (xmlMemTraceBlockAt == ret) { |
275 xmlGenericError(xmlGenericErrorContext, | 276 xmlGenericError(xmlGenericErrorContext, |
276 » » » "%p : Malloc(%ld) Ok\n", xmlMemTraceBlockAt, size); | 277 » » » "%p : Malloc(%lu) Ok\n", xmlMemTraceBlockAt, |
| 278 » » » (long unsigned)size); |
277 xmlMallocBreakpoint(); | 279 xmlMallocBreakpoint(); |
278 } | 280 } |
279 | 281 |
280 TEST_POINT | 282 TEST_POINT |
281 | 283 |
282 return(ret); | 284 return(ret); |
283 } | 285 } |
284 /** | 286 /** |
285 * xmlMemMalloc: | 287 * xmlMemMalloc: |
286 * @size: an int specifying the size in byte to allocate. | 288 * @size: an int specifying the size in byte to allocate. |
(...skipping 17 matching lines...) Expand all Loading... |
304 * @line: the line number | 306 * @line: the line number |
305 * | 307 * |
306 * a realloc() equivalent, with logging of the allocation info. | 308 * a realloc() equivalent, with logging of the allocation info. |
307 * | 309 * |
308 * Returns a pointer to the allocated area or NULL in case of lack of memory. | 310 * Returns a pointer to the allocated area or NULL in case of lack of memory. |
309 */ | 311 */ |
310 | 312 |
311 void * | 313 void * |
312 xmlReallocLoc(void *ptr,size_t size, const char * file, int line) | 314 xmlReallocLoc(void *ptr,size_t size, const char * file, int line) |
313 { | 315 { |
314 MEMHDR *p; | 316 MEMHDR *p, *tmp; |
315 unsigned long number; | 317 unsigned long number; |
316 #ifdef DEBUG_MEMORY | 318 #ifdef DEBUG_MEMORY |
317 size_t oldsize; | 319 size_t oldsize; |
318 #endif | 320 #endif |
319 | 321 |
320 if (ptr == NULL) | 322 if (ptr == NULL) |
321 return(xmlMallocLoc(size, file, line)); | 323 return(xmlMallocLoc(size, file, line)); |
322 | 324 |
323 if (!xmlMemInitialized) xmlInitMemory(); | 325 if (!xmlMemInitialized) xmlInitMemory(); |
324 TEST_POINT | 326 TEST_POINT |
(...skipping 10 matching lines...) Expand all Loading... |
335 debugMemSize -= p->mh_size; | 337 debugMemSize -= p->mh_size; |
336 debugMemBlocks--; | 338 debugMemBlocks--; |
337 #ifdef DEBUG_MEMORY | 339 #ifdef DEBUG_MEMORY |
338 oldsize = p->mh_size; | 340 oldsize = p->mh_size; |
339 #endif | 341 #endif |
340 #ifdef MEM_LIST | 342 #ifdef MEM_LIST |
341 debugmem_list_delete(p); | 343 debugmem_list_delete(p); |
342 #endif | 344 #endif |
343 xmlMutexUnlock(xmlMemMutex); | 345 xmlMutexUnlock(xmlMemMutex); |
344 | 346 |
345 p = (MEMHDR *) realloc(p,RESERVE_SIZE+size); | 347 tmp = (MEMHDR *) realloc(p,RESERVE_SIZE+size); |
346 if (!p) { | 348 if (!tmp) { |
| 349 » free(p); |
347 goto error; | 350 goto error; |
348 } | 351 } |
| 352 p = tmp; |
349 if (xmlMemTraceBlockAt == ptr) { | 353 if (xmlMemTraceBlockAt == ptr) { |
350 xmlGenericError(xmlGenericErrorContext, | 354 xmlGenericError(xmlGenericErrorContext, |
351 » » » "%p : Realloced(%ld -> %ld) Ok\n", | 355 » » » "%p : Realloced(%lu -> %lu) Ok\n", |
352 » » » xmlMemTraceBlockAt, p->mh_size, size); | 356 » » » xmlMemTraceBlockAt, (long unsigned)p->mh_size, |
| 357 » » » (long unsigned)size); |
353 xmlMallocBreakpoint(); | 358 xmlMallocBreakpoint(); |
354 } | 359 } |
355 p->mh_tag = MEMTAG; | 360 p->mh_tag = MEMTAG; |
356 p->mh_number = number; | 361 p->mh_number = number; |
357 p->mh_type = REALLOC_TYPE; | 362 p->mh_type = REALLOC_TYPE; |
358 p->mh_size = size; | 363 p->mh_size = size; |
359 p->mh_file = file; | 364 p->mh_file = file; |
360 p->mh_line = line; | 365 p->mh_line = line; |
361 xmlMutexLock(xmlMemMutex); | 366 xmlMutexLock(xmlMemMutex); |
362 debugMemSize += size; | 367 debugMemSize += size; |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
502 if (debugMemSize > debugMaxMemSize) debugMaxMemSize = debugMemSize; | 507 if (debugMemSize > debugMaxMemSize) debugMaxMemSize = debugMemSize; |
503 #ifdef MEM_LIST | 508 #ifdef MEM_LIST |
504 debugmem_list_add(p); | 509 debugmem_list_add(p); |
505 #endif | 510 #endif |
506 xmlMutexUnlock(xmlMemMutex); | 511 xmlMutexUnlock(xmlMemMutex); |
507 | 512 |
508 s = (char *) HDR_2_CLIENT(p); | 513 s = (char *) HDR_2_CLIENT(p); |
509 | 514 |
510 if (xmlMemStopAtBlock == p->mh_number) xmlMallocBreakpoint(); | 515 if (xmlMemStopAtBlock == p->mh_number) xmlMallocBreakpoint(); |
511 | 516 |
512 if (s != NULL) | 517 strcpy(s,str); |
513 strcpy(s,str); | |
514 else | |
515 goto error; | |
516 | 518 |
517 TEST_POINT | 519 TEST_POINT |
518 | 520 |
519 if (xmlMemTraceBlockAt == s) { | 521 if (xmlMemTraceBlockAt == s) { |
520 xmlGenericError(xmlGenericErrorContext, | 522 xmlGenericError(xmlGenericErrorContext, |
521 "%p : Strdup() Ok\n", xmlMemTraceBlockAt); | 523 "%p : Strdup() Ok\n", xmlMemTraceBlockAt); |
522 xmlMallocBreakpoint(); | 524 xmlMallocBreakpoint(); |
523 } | 525 } |
524 | 526 |
525 return(s); | 527 return(s); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
573 * xmlMemContentShow: | 575 * xmlMemContentShow: |
574 * @fp: a FILE descriptor used as the output file | 576 * @fp: a FILE descriptor used as the output file |
575 * @p: a memory block header | 577 * @p: a memory block header |
576 * | 578 * |
577 * tries to show some content from the memory block | 579 * tries to show some content from the memory block |
578 */ | 580 */ |
579 | 581 |
580 static void | 582 static void |
581 xmlMemContentShow(FILE *fp, MEMHDR *p) | 583 xmlMemContentShow(FILE *fp, MEMHDR *p) |
582 { | 584 { |
583 int i,j,k,len = p->mh_size; | 585 int i,j,k,len; |
584 const char *buf = (const char *) HDR_2_CLIENT(p); | 586 const char *buf; |
585 | 587 |
586 if (p == NULL) { | 588 if (p == NULL) { |
587 fprintf(fp, " NULL"); | 589 fprintf(fp, " NULL"); |
588 return; | 590 return; |
589 } | 591 } |
| 592 len = p->mh_size; |
| 593 buf = (const char *) HDR_2_CLIENT(p); |
590 | 594 |
591 for (i = 0;i < len;i++) { | 595 for (i = 0;i < len;i++) { |
592 if (buf[i] == 0) break; | 596 if (buf[i] == 0) break; |
593 if (!isprint((unsigned char) buf[i])) break; | 597 if (!isprint((unsigned char) buf[i])) break; |
594 } | 598 } |
595 if ((i < 4) && ((buf[i] != 0) || (i == 0))) { | 599 if ((i < 4) && ((buf[i] != 0) || (i == 0))) { |
596 if (len >= 4) { | 600 if (len >= 4) { |
597 MEMHDR *q; | 601 MEMHDR *q; |
598 void *cur; | 602 void *cur; |
599 | 603 |
(...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1111 if (freeFunc != NULL) *freeFunc = xmlFree; | 1115 if (freeFunc != NULL) *freeFunc = xmlFree; |
1112 if (mallocFunc != NULL) *mallocFunc = xmlMalloc; | 1116 if (mallocFunc != NULL) *mallocFunc = xmlMalloc; |
1113 if (mallocAtomicFunc != NULL) *mallocAtomicFunc = xmlMallocAtomic; | 1117 if (mallocAtomicFunc != NULL) *mallocAtomicFunc = xmlMallocAtomic; |
1114 if (reallocFunc != NULL) *reallocFunc = xmlRealloc; | 1118 if (reallocFunc != NULL) *reallocFunc = xmlRealloc; |
1115 if (strdupFunc != NULL) *strdupFunc = xmlMemStrdup; | 1119 if (strdupFunc != NULL) *strdupFunc = xmlMemStrdup; |
1116 return(0); | 1120 return(0); |
1117 } | 1121 } |
1118 | 1122 |
1119 #define bottom_xmlmemory | 1123 #define bottom_xmlmemory |
1120 #include "elfgcchack.h" | 1124 #include "elfgcchack.h" |
OLD | NEW |