Index: third_party/libxml/xmlmemory.c |
diff --git a/third_party/libxml/xmlmemory.c b/third_party/libxml/xmlmemory.c |
index f9019a42d13e2355d78642e165e2643cb0d7120d..433abb8efedf5dac482ed744857ccfa896d43309 100644 |
--- a/third_party/libxml/xmlmemory.c |
+++ b/third_party/libxml/xmlmemory.c |
@@ -34,7 +34,7 @@ |
/** |
* MEM_LIST: |
* |
- * keep track of all allocated blocks for error reporting |
+ * keep track of all allocated blocks for error reporting |
* Always build the memory list ! |
*/ |
#ifdef DEBUG_MEMORY_LOCATION |
@@ -162,7 +162,7 @@ xmlMallocLoc(size_t size, const char * file, int line) |
{ |
MEMHDR *p; |
void *ret; |
- |
+ |
if (!xmlMemInitialized) xmlInitMemory(); |
#ifdef DEBUG_MEMORY |
xmlGenericError(xmlGenericErrorContext, |
@@ -170,7 +170,7 @@ xmlMallocLoc(size_t size, const char * file, int line) |
#endif |
TEST_POINT |
- |
+ |
p = (MEMHDR *) malloc(RESERVE_SIZE+size); |
if (!p) { |
@@ -178,7 +178,7 @@ xmlMallocLoc(size_t size, const char * file, int line) |
"xmlMallocLoc : Out of free space\n"); |
xmlMemoryDump(); |
return(NULL); |
- } |
+ } |
p->mh_tag = MEMTAG; |
p->mh_size = size; |
p->mh_type = MALLOC_TYPE; |
@@ -193,19 +193,19 @@ xmlMallocLoc(size_t size, const char * file, int line) |
debugmem_list_add(p); |
#endif |
xmlMutexUnlock(xmlMemMutex); |
- |
+ |
#ifdef DEBUG_MEMORY |
xmlGenericError(xmlGenericErrorContext, |
"Malloc(%d) Ok\n",size); |
#endif |
- |
+ |
if (xmlMemStopAtBlock == p->mh_number) xmlMallocBreakpoint(); |
ret = HDR_2_CLIENT(p); |
if (xmlMemTraceBlockAt == ret) { |
xmlGenericError(xmlGenericErrorContext, |
- "%p : Malloc(%d) Ok\n", xmlMemTraceBlockAt, size); |
+ "%p : Malloc(%ld) Ok\n", xmlMemTraceBlockAt, size); |
xmlMallocBreakpoint(); |
} |
@@ -230,7 +230,7 @@ xmlMallocAtomicLoc(size_t size, const char * file, int line) |
{ |
MEMHDR *p; |
void *ret; |
- |
+ |
if (!xmlMemInitialized) xmlInitMemory(); |
#ifdef DEBUG_MEMORY |
xmlGenericError(xmlGenericErrorContext, |
@@ -238,7 +238,7 @@ xmlMallocAtomicLoc(size_t size, const char * file, int line) |
#endif |
TEST_POINT |
- |
+ |
p = (MEMHDR *) malloc(RESERVE_SIZE+size); |
if (!p) { |
@@ -246,7 +246,7 @@ xmlMallocAtomicLoc(size_t size, const char * file, int line) |
"xmlMallocLoc : Out of free space\n"); |
xmlMemoryDump(); |
return(NULL); |
- } |
+ } |
p->mh_tag = MEMTAG; |
p->mh_size = size; |
p->mh_type = MALLOC_ATOMIC_TYPE; |
@@ -266,14 +266,14 @@ xmlMallocAtomicLoc(size_t size, const char * file, int line) |
xmlGenericError(xmlGenericErrorContext, |
"Malloc(%d) Ok\n",size); |
#endif |
- |
+ |
if (xmlMemStopAtBlock == p->mh_number) xmlMallocBreakpoint(); |
ret = HDR_2_CLIENT(p); |
if (xmlMemTraceBlockAt == ret) { |
xmlGenericError(xmlGenericErrorContext, |
- "%p : Malloc(%d) Ok\n", xmlMemTraceBlockAt, size); |
+ "%p : Malloc(%ld) Ok\n", xmlMemTraceBlockAt, size); |
xmlMallocBreakpoint(); |
} |
@@ -341,14 +341,14 @@ xmlReallocLoc(void *ptr,size_t size, const char * file, int line) |
debugmem_list_delete(p); |
#endif |
xmlMutexUnlock(xmlMemMutex); |
- |
+ |
p = (MEMHDR *) realloc(p,RESERVE_SIZE+size); |
if (!p) { |
goto error; |
} |
if (xmlMemTraceBlockAt == ptr) { |
xmlGenericError(xmlGenericErrorContext, |
- "%p : Realloced(%d -> %d) Ok\n", |
+ "%p : Realloced(%ld -> %ld) Ok\n", |
xmlMemTraceBlockAt, p->mh_size, size); |
xmlMallocBreakpoint(); |
} |
@@ -374,8 +374,8 @@ xmlReallocLoc(void *ptr,size_t size, const char * file, int line) |
"Realloced(%d to %d) Ok\n", oldsize, size); |
#endif |
return(HDR_2_CLIENT(p)); |
- |
-error: |
+ |
+error: |
return(NULL); |
} |
@@ -455,10 +455,10 @@ xmlMemFree(void *ptr) |
xmlGenericError(xmlGenericErrorContext, |
"Freed(%d) Ok\n", size); |
#endif |
- |
+ |
return; |
- |
-error: |
+ |
+error: |
xmlGenericError(xmlGenericErrorContext, |
"xmlMemFree(%lX) error\n", (unsigned long) ptr); |
xmlMallocBreakpoint(); |
@@ -504,16 +504,16 @@ xmlMemStrdupLoc(const char *str, const char *file, int line) |
debugmem_list_add(p); |
#endif |
xmlMutexUnlock(xmlMemMutex); |
- |
+ |
s = (char *) HDR_2_CLIENT(p); |
- |
+ |
if (xmlMemStopAtBlock == p->mh_number) xmlMallocBreakpoint(); |
if (s != NULL) |
strcpy(s,str); |
else |
goto error; |
- |
+ |
TEST_POINT |
if (xmlMemTraceBlockAt == s) { |
@@ -617,7 +617,7 @@ xmlMemContentShow(FILE *fp, MEMHDR *p) |
} else if ((i == 0) && (buf[i] == 0)) { |
fprintf(fp," null"); |
} else { |
- if (buf[i] == 0) fprintf(fp," \"%.25s\"", buf); |
+ if (buf[i] == 0) fprintf(fp," \"%.25s\"", buf); |
else { |
fprintf(fp," ["); |
for (j = 0;j < i;j++) |
@@ -629,6 +629,79 @@ xmlMemContentShow(FILE *fp, MEMHDR *p) |
#endif |
/** |
+ * xmlMemDisplayLast: |
+ * @fp: a FILE descriptor used as the output file, if NULL, the result is |
+ * written to the file .memorylist |
+ * @nbBytes: the amount of memory to dump |
+ * |
+ * the last nbBytes of memory allocated and not freed, useful for dumping |
+ * the memory left allocated between two places at runtime. |
+ */ |
+ |
+void |
+xmlMemDisplayLast(FILE *fp, long nbBytes) |
+{ |
+#ifdef MEM_LIST |
+ MEMHDR *p; |
+ unsigned idx; |
+ int nb = 0; |
+#endif |
+ FILE *old_fp = fp; |
+ |
+ if (nbBytes <= 0) |
+ return; |
+ |
+ if (fp == NULL) { |
+ fp = fopen(".memorylist", "w"); |
+ if (fp == NULL) |
+ return; |
+ } |
+ |
+#ifdef MEM_LIST |
+ fprintf(fp," Last %li MEMORY ALLOCATED : %lu, MAX was %lu\n", |
+ nbBytes, debugMemSize, debugMaxMemSize); |
+ fprintf(fp,"BLOCK NUMBER SIZE TYPE\n"); |
+ idx = 0; |
+ xmlMutexLock(xmlMemMutex); |
+ p = memlist; |
+ while ((p) && (nbBytes > 0)) { |
+ fprintf(fp,"%-5u %6lu %6lu ",idx++,p->mh_number, |
+ (unsigned long)p->mh_size); |
+ switch (p->mh_type) { |
+ case STRDUP_TYPE:fprintf(fp,"strdup() in ");break; |
+ case MALLOC_TYPE:fprintf(fp,"malloc() in ");break; |
+ case REALLOC_TYPE:fprintf(fp,"realloc() in ");break; |
+ case MALLOC_ATOMIC_TYPE:fprintf(fp,"atomicmalloc() in ");break; |
+ case REALLOC_ATOMIC_TYPE:fprintf(fp,"atomicrealloc() in ");break; |
+ default: |
+ fprintf(fp,"Unknown memory block, may be corrupted"); |
+ xmlMutexUnlock(xmlMemMutex); |
+ if (old_fp == NULL) |
+ fclose(fp); |
+ return; |
+ } |
+ if (p->mh_file != NULL) fprintf(fp,"%s(%u)", p->mh_file, p->mh_line); |
+ if (p->mh_tag != MEMTAG) |
+ fprintf(fp," INVALID"); |
+ nb++; |
+ if (nb < 100) |
+ xmlMemContentShow(fp, p); |
+ else |
+ fprintf(fp," skip"); |
+ |
+ fprintf(fp,"\n"); |
+ nbBytes -= (unsigned long)p->mh_size; |
+ p = p->mh_next; |
+ } |
+ xmlMutexUnlock(xmlMemMutex); |
+#else |
+ fprintf(fp,"Memory list not compiled (MEM_LIST not defined !)\n"); |
+#endif |
+ if (old_fp == NULL) |
+ fclose(fp); |
+} |
+ |
+/** |
* xmlMemDisplay: |
* @fp: a FILE descriptor used as the output file, if NULL, the result is |
* written to the file .memorylist |
@@ -665,7 +738,7 @@ xmlMemDisplay(FILE *fp) |
fprintf(fp," %s\n\n", buf); |
#endif |
- |
+ |
fprintf(fp," MEMORY ALLOCATED : %lu, MAX was %lu\n", |
debugMemSize, debugMaxMemSize); |
fprintf(fp,"BLOCK NUMBER SIZE TYPE\n"); |
@@ -742,7 +815,7 @@ static void debugmem_list_delete(MEMHDR *p) |
* |
* internal error function. |
*/ |
- |
+ |
static void debugmem_tag_error(void *p) |
{ |
xmlGenericError(xmlGenericErrorContext, |
@@ -802,7 +875,7 @@ xmlMemShow(FILE *fp, int nr ATTRIBUTE_UNUSED) |
} |
} |
xmlMutexUnlock(xmlMemMutex); |
-#endif /* MEM_LIST */ |
+#endif /* MEM_LIST */ |
} |
/** |
@@ -849,11 +922,11 @@ xmlInitMemory(void) |
{ |
#ifdef HAVE_STDLIB_H |
char *breakpoint; |
-#endif |
+#endif |
#ifdef DEBUG_MEMORY |
xmlGenericError(xmlGenericErrorContext, |
"xmlInitMemory()\n"); |
-#endif |
+#endif |
/* |
This is really not good code (see Bug 130419). Suggestions for |
improvement will be welcome! |
@@ -867,18 +940,18 @@ xmlInitMemory(void) |
if (breakpoint != NULL) { |
sscanf(breakpoint, "%ud", &xmlMemStopAtBlock); |
} |
-#endif |
+#endif |
#ifdef HAVE_STDLIB_H |
breakpoint = getenv("XML_MEM_TRACE"); |
if (breakpoint != NULL) { |
sscanf(breakpoint, "%p", &xmlMemTraceBlockAt); |
} |
-#endif |
- |
+#endif |
+ |
#ifdef DEBUG_MEMORY |
xmlGenericError(xmlGenericErrorContext, |
"xmlInitMemory() Ok\n"); |
-#endif |
+#endif |
return(0); |
} |
@@ -893,7 +966,7 @@ xmlCleanupMemory(void) { |
#ifdef DEBUG_MEMORY |
xmlGenericError(xmlGenericErrorContext, |
"xmlCleanupMemory()\n"); |
-#endif |
+#endif |
if (xmlMemInitialized == 0) |
return; |
@@ -903,7 +976,7 @@ xmlCleanupMemory(void) { |
#ifdef DEBUG_MEMORY |
xmlGenericError(xmlGenericErrorContext, |
"xmlCleanupMemory() Ok\n"); |
-#endif |
+#endif |
} |
/** |
@@ -927,7 +1000,7 @@ xmlMemSetup(xmlFreeFunc freeFunc, xmlMallocFunc mallocFunc, |
#ifdef DEBUG_MEMORY |
xmlGenericError(xmlGenericErrorContext, |
"xmlMemSetup()\n"); |
-#endif |
+#endif |
if (freeFunc == NULL) |
return(-1); |
if (mallocFunc == NULL) |
@@ -944,7 +1017,7 @@ xmlMemSetup(xmlFreeFunc freeFunc, xmlMallocFunc mallocFunc, |
#ifdef DEBUG_MEMORY |
xmlGenericError(xmlGenericErrorContext, |
"xmlMemSetup() Ok\n"); |
-#endif |
+#endif |
return(0); |
} |
@@ -994,7 +1067,7 @@ xmlGcMemSetup(xmlFreeFunc freeFunc, xmlMallocFunc mallocFunc, |
#ifdef DEBUG_MEMORY |
xmlGenericError(xmlGenericErrorContext, |
"xmlGcMemSetup()\n"); |
-#endif |
+#endif |
if (freeFunc == NULL) |
return(-1); |
if (mallocFunc == NULL) |
@@ -1013,7 +1086,7 @@ xmlGcMemSetup(xmlFreeFunc freeFunc, xmlMallocFunc mallocFunc, |
#ifdef DEBUG_MEMORY |
xmlGenericError(xmlGenericErrorContext, |
"xmlGcMemSetup() Ok\n"); |
-#endif |
+#endif |
return(0); |
} |