浏览代码

Memory debugging for Windows

bel 11 年之前
父节点
当前提交
950d47e198
共有 1 个文件被更改,包括 35 次插入15 次删除
  1. 35 15
      src/civetweb.c

+ 35 - 15
src/civetweb.c

@@ -319,45 +319,60 @@ typedef int SOCKET;
 #endif
 #define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))
 
-void * mg_malloc(size_t size) {
-    void * data = malloc(size);
-    
+static unsigned long totalMemUsed = 0;
+
+static void * mg_malloc_ex(size_t size, const char * file, unsigned line) {
+
+    void * data = malloc(size + sizeof(size_t));
+    void * memory = 0;
     char mallocStr[256];
-    sprintf(mallocStr, "malloc(%u) -> %p\n", size, data);
+
+    if (data) {
+        *(size_t*)data = size;
+        totalMemUsed += size;
+        memory = (void *)(((char*)data)+sizeof(size_t));
+    }
+    sprintf(mallocStr, "malloc(%u) -> %p (%u)  --- %s:%u\n", size, memory, totalMemUsed, file, line);
     OutputDebugStringA(mallocStr);
 
-    return malloc(size);
+    return memory;
 }
 
-void * mg_calloc(size_t count, size_t size) {
+static void * mg_calloc_ex(size_t count, size_t size, const char * file, unsigned line) {
 
-    void * data = mg_malloc(size);
+    void * data = mg_malloc_ex(size*count, file, line);
     if (data) memset(data, 0, size);
 
     return data;
 }
 
-void mg_free(void * memory) {
+static void mg_free_ex(void * memory, const char * file, unsigned line) {
 
     char mallocStr[256];
-    sprintf(mallocStr, "free(%p)\n", memory);
-    OutputDebugStringA(mallocStr);
+    void * data = (void *)(((char*)memory)-sizeof(size_t));
+    size_t size = *(size_t*)data;
+
+    if (memory) {
+        totalMemUsed -= size;
+        sprintf(mallocStr, "free(%p) (%u, %u)  --- %s:%u\n", memory, size, totalMemUsed, file, line);
+        OutputDebugStringA(mallocStr);
 
-    free(memory);
+        free(data);
+    }
 }
 
-void * mg_realloc(void * memory, size_t newsize) {
+static void * mg_realloc_ex(void * memory, size_t newsize, const char * file, unsigned line) {
 
     void * data;
     if (newsize) {
-        data = mg_malloc(newsize);
+        data = mg_malloc_ex(newsize, file, line);
         if ((data!=NULL) && (memory!=NULL)) {
             memcpy(data, memory, newsize);
-            mg_free(memory);
+            mg_free_ex(memory, file, line);
         }
     } else {
         data = 0;
-        mg_free(memory);
+        mg_free_ex(memory, file, line);
     }
 
     return data;
@@ -368,6 +383,11 @@ void * mg_realloc(void * memory, size_t newsize) {
 #define realloc DO_NOT_USE_THIS_FUNCTION__USE_mg_realloc
 #define free    DO_NOT_USE_THIS_FUNCTION__USE_mg_free
 
+#define mg_malloc(a)      mg_malloc_ex(a, __FILE__, __LINE__)
+#define mg_calloc(a,b)    mg_calloc_ex(a, b, __FILE__, __LINE__)
+#define mg_realloc(a, b)  mg_realloc_ex(a, b, __FILE__, __LINE__)
+#define mg_free(a)        mg_free_ex(a, __FILE__, __LINE__)
+
 #ifdef _WIN32
 static CRITICAL_SECTION global_log_file_lock;
 static DWORD pthread_self(void)