[Groonga-commit] groonga/groonga [master] memory-debug: support memory allocation expansion by realloc.

Back to archive index

null+****@clear***** null+****@clear*****
2011年 1月 10日 (月) 17:44:27 JST


Kouhei Sutou	2011-01-10 08:44:27 +0000 (Mon, 10 Jan 2011)

  New Revision: bd5cedfc97c4a17dfb0115fd9e393ebcb58bcfcb

  Log:
    memory-debug: support memory allocation expansion by realloc.

  Modified files:
    lib/ctx.c

  Modified: lib/ctx.c (+25 -3)
===================================================================
--- lib/ctx.c    2011-01-10 07:55:53 +0000 (3e0d869)
+++ lib/ctx.c    2011-01-10 08:44:27 +0000 (3dc608e)
@@ -204,6 +204,8 @@ grn_alloc_info_set_backtrace(char *buffer, size_t size)
       rest--;
     }
     free(symbols);
+  } else {
+    buffer[0] = '\0';
   }
 #  undef N_TRACE_LEVEL
 }
@@ -220,7 +222,6 @@ grn_alloc_info_add(void *address)
   new_alloc_info = malloc(sizeof(grn_alloc_info));
   new_alloc_info->address = address;
   new_alloc_info->freed = GRN_FALSE;
-  new_alloc_info->alloc_backtrace[0] = '\0';
   grn_alloc_info_set_backtrace(new_alloc_info->alloc_backtrace,
                                sizeof(new_alloc_info->alloc_backtrace));
   new_alloc_info->next = ctx->impl->alloc_info;
@@ -228,6 +229,25 @@ grn_alloc_info_add(void *address)
 }
 
 inline static void
+grn_alloc_info_change(void *old_address, void *new_address)
+{
+  grn_ctx *ctx;
+  grn_alloc_info *alloc_info;
+
+  ctx = &grn_gctx;
+  if (!ctx->impl) { return; }
+
+  alloc_info = ctx->impl->alloc_info;
+  for (; alloc_info; alloc_info = alloc_info->next) {
+    if (alloc_info->address == old_address) {
+      alloc_info->address = new_address;
+      grn_alloc_info_set_backtrace(alloc_info->alloc_backtrace,
+                                   sizeof(alloc_info->alloc_backtrace));
+    }
+  }
+}
+
+inline static void
 grn_alloc_info_dump(grn_ctx *ctx)
 {
   int i = 0;
@@ -269,7 +289,6 @@ grn_alloc_info_check(void *address)
                 alloc_info->free_backtrace);
       } else {
         alloc_info->freed = GRN_TRUE;
-        alloc_info->free_backtrace[0] = '\0';
         grn_alloc_info_set_backtrace(alloc_info->free_backtrace,
                                      sizeof(alloc_info->free_backtrace));
       }
@@ -298,6 +317,7 @@ grn_alloc_info_free(grn_ctx *ctx)
 
 #else /* ENABLE_MEMORY_DEBUG */
 #  define grn_alloc_info_add(address)
+#  define grn_alloc_info_change(old_address, new_address)
 #  define grn_alloc_info_check(address)
 #  define grn_alloc_info_dump(ctx)
 #  define grn_alloc_info_free(ctx)
@@ -2162,7 +2182,9 @@ grn_realloc_default(grn_ctx *ctx, void *ptr, size_t size, const char* file, int
         return NULL;
       }
     }
-    if (!ptr) {
+    if (ptr) {
+      grn_alloc_info_change(ptr, res);
+    } else {
       GRN_ADD_ALLOC_COUNT(1);
       grn_alloc_info_add(res);
     }




Groonga-commit メーリングリストの案内
Back to archive index