]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add the call function tracking to isc_mem API
authorOndřej Surý <ondrej@isc.org>
Mon, 9 Sep 2024 11:59:43 +0000 (13:59 +0200)
committerOndřej Surý <ondrej@sury.org>
Wed, 5 Mar 2025 06:55:50 +0000 (07:55 +0100)
As we already track __func__, __FILE__, __LINE__ triplet in most places,
add the function tracking to the isc_mem tracking API.

lib/isc/crypto.c
lib/isc/include/isc/mem.h
lib/isc/mem.c
util/memleak.pl

index c99592befc390e56801eacfe7d64d1732e85cd7b..604a6439b73fc601fdc00fae6add513805379c05 100644 (file)
@@ -114,14 +114,14 @@ unregister_algorithms(void) {
 
 static void *
 isc__crypto_malloc_ex(size_t size, const char *file, int line) {
-       return isc__mem_allocate(isc__crypto_mctx, size, 0, file,
+       return isc__mem_allocate(isc__crypto_mctx, size, 0, __func__, file,
                                 (unsigned int)line);
 }
 
 static void *
 isc__crypto_realloc_ex(void *ptr, size_t size, const char *file, int line) {
-       return isc__mem_reallocate(isc__crypto_mctx, ptr, size, 0, file,
-                                  (unsigned int)line);
+       return isc__mem_reallocate(isc__crypto_mctx, ptr, size, 0, __func__,
+                                  file, (unsigned int)line);
 }
 
 static void
@@ -130,7 +130,7 @@ isc__crypto_free_ex(void *ptr, const char *file, int line) {
                return;
        }
        if (isc__crypto_mctx != NULL) {
-               isc__mem_free(isc__crypto_mctx, ptr, 0, file,
+               isc__mem_free(isc__crypto_mctx, ptr, 0, __func__, file,
                              (unsigned int)line);
        }
 }
index 9f44628d0143bbbc811038b28c66b98afb26be85..09382cfc02198396bbab92d5ed57e7e1867cfb9b 100644 (file)
@@ -65,8 +65,8 @@ extern unsigned int isc_mem_defaultflags;
 /*@}*/
 
 #if ISC_MEM_TRACKLINES
-#define _ISC_MEM_FILELINE , __FILE__, __LINE__
-#define _ISC_MEM_FLARG   , const char *, unsigned int
+#define _ISC_MEM_FILELINE , __func__, __FILE__, __LINE__
+#define _ISC_MEM_FLARG   , const char *, const char *, unsigned int
 #else /* if ISC_MEM_TRACKLINES */
 #define _ISC_MEM_FILELINE
 #define _ISC_MEM_FLARG
index 5edf15a8f6b1c95622df3a8ef54ee58134dde5a3..1b569f042d46a1e98c463455b4198d1c93b88809 100644 (file)
@@ -86,14 +86,15 @@ struct debuglink {
        ISC_LINK(debuglink_t) link;
        const void *ptr;
        size_t size;
+       const char *func;
        const char *file;
        unsigned int line;
 };
 
 typedef ISC_LIST(debuglink_t) debuglist_t;
 
-#define FLARG_PASS , file, line
-#define FLARG     , const char *file, unsigned int line
+#define FLARG_PASS , func, file, line
+#define FLARG     , const char *func, const char *file, unsigned int line
 #else /* if ISC_MEM_TRACKLINES */
 #define FLARG_PASS
 #define FLARG
@@ -164,8 +165,8 @@ struct isc_mempool {
  */
 
 #if !ISC_MEM_TRACKLINES
-#define ADD_TRACE(mctx, ptr, size, file, line)
-#define DELETE_TRACE(mctx, ptr, size, file, line)
+#define ADD_TRACE(mctx, ptr, size, func, file, line)
+#define DELETE_TRACE(mctx, ptr, size, func, file, line)
 #define ISC_MEMFUNC_SCOPE
 #else /* if !ISC_MEM_TRACKLINES */
 #define TRACE_OR_RECORD (ISC_MEM_DEBUGTRACE | ISC_MEM_DEBUGRECORD)
@@ -173,14 +174,14 @@ struct isc_mempool {
 #define SHOULD_TRACE_OR_RECORD(mctx, ptr) \
        (((mctx)->debugging & TRACE_OR_RECORD) != 0 && ptr != NULL)
 
-#define ADD_TRACE(mctx, ptr, size, file, line)                \
-       if (SHOULD_TRACE_OR_RECORD(mctx, ptr)) {              \
-               add_trace_entry(mctx, ptr, size, file, line); \
+#define ADD_TRACE(mctx, ptr, size, func, file, line)                \
+       if (SHOULD_TRACE_OR_RECORD(mctx, ptr)) {                    \
+               add_trace_entry(mctx, ptr, size, func, file, line); \
        }
 
-#define DELETE_TRACE(mctx, ptr, size, file, line)                \
-       if (SHOULD_TRACE_OR_RECORD(mctx, ptr)) {                 \
-               delete_trace_entry(mctx, ptr, size, file, line); \
+#define DELETE_TRACE(mctx, ptr, size, func, file, line)                \
+       if (SHOULD_TRACE_OR_RECORD(mctx, ptr)) {                       \
+               delete_trace_entry(mctx, ptr, size, func, file, line); \
        }
 
 static void
@@ -200,8 +201,9 @@ add_trace_entry(isc_mem_t *mctx, const void *ptr, size_t size FLARG) {
        MCTXLOCK(mctx);
 
        if ((mctx->debugging & ISC_MEM_DEBUGTRACE) != 0) {
-               fprintf(stderr, "add %p size %zu file %s line %u mctx %p\n",
-                       ptr, size, file, line, mctx);
+               fprintf(stderr,
+                       "add %p size %zu func %s file %s line %u mctx %p\n",
+                       ptr, size, func, file, line, mctx);
        }
 
        if (mctx->debuglist == NULL) {
@@ -225,6 +227,7 @@ add_trace_entry(isc_mem_t *mctx, const void *ptr, size_t size FLARG) {
        ISC_LINK_INIT(dl, link);
        dl->ptr = ptr;
        dl->size = size;
+       dl->func = func;
        dl->file = file;
        dl->line = line;
 
@@ -235,8 +238,7 @@ unlock:
 }
 
 static void
-delete_trace_entry(isc_mem_t *mctx, const void *ptr, size_t size,
-                  const char *file, unsigned int line) {
+delete_trace_entry(isc_mem_t *mctx, const void *ptr, size_t size FLARG) {
        debuglink_t *dl = NULL;
        uint32_t hash;
        uint32_t idx;
@@ -244,8 +246,9 @@ delete_trace_entry(isc_mem_t *mctx, const void *ptr, size_t size,
        MCTXLOCK(mctx);
 
        if ((mctx->debugging & ISC_MEM_DEBUGTRACE) != 0) {
-               fprintf(stderr, "del %p size %zu file %s line %u mctx %p\n",
-                       ptr, size, file, line, mctx);
+               fprintf(stderr,
+                       "del %p size %zu func %s file %s line %u mctx %p\n",
+                       ptr, size, func, file, line, mctx);
        }
 
        if (mctx->debuglist == NULL) {
@@ -576,7 +579,7 @@ isc__mem_putanddetach(isc_mem_t **ctxp, void *ptr, size_t size,
 
        isc__mem_put(ctx, ptr, size, flags FLARG_PASS);
 #if ISC_MEM_TRACE
-       isc_mem__detach(&ctx, __func__, file, line);
+       isc_mem__detach(&ctx, func, file, line);
 #else
        isc_mem_detach(&ctx);
 #endif
@@ -591,7 +594,7 @@ isc__mem_get(isc_mem_t *ctx, size_t size, int flags FLARG) {
        ptr = mem_get(ctx, size, flags);
 
        mem_getstats(ctx, size);
-       ADD_TRACE(ctx, ptr, size, file, line);
+       ADD_TRACE(ctx, ptr, size, func, file, line);
 
        return ptr;
 }
@@ -600,7 +603,7 @@ void
 isc__mem_put(isc_mem_t *ctx, void *ptr, size_t size, int flags FLARG) {
        REQUIRE(VALID_CONTEXT(ctx));
 
-       DELETE_TRACE(ctx, ptr, size, file, line);
+       DELETE_TRACE(ctx, ptr, size, func, file, line);
 
        mem_putstats(ctx, size);
        mem_put(ctx, ptr, size, flags);
@@ -697,7 +700,7 @@ isc__mem_allocate(isc_mem_t *ctx, size_t size, int flags FLARG) {
        size = sallocx(ptr, flags | ctx->jemalloc_flags);
 
        mem_getstats(ctx, size);
-       ADD_TRACE(ctx, ptr, size, file, line);
+       ADD_TRACE(ctx, ptr, size, func, file, line);
 
        return ptr;
 }
@@ -713,13 +716,13 @@ isc__mem_reget(isc_mem_t *ctx, void *old_ptr, size_t old_size, size_t new_size,
        } else if (new_size == 0) {
                isc__mem_put(ctx, old_ptr, old_size, flags FLARG_PASS);
        } else {
-               DELETE_TRACE(ctx, old_ptr, old_size, file, line);
+               DELETE_TRACE(ctx, old_ptr, old_size, func, file, line);
                mem_putstats(ctx, old_size);
 
                new_ptr = mem_realloc(ctx, old_ptr, old_size, new_size, flags);
 
                mem_getstats(ctx, new_size);
-               ADD_TRACE(ctx, new_ptr, new_size, file, line);
+               ADD_TRACE(ctx, new_ptr, new_size, func, file, line);
 
                /*
                 * We want to postpone the call to water in edge case
@@ -745,7 +748,7 @@ isc__mem_reallocate(isc_mem_t *ctx, void *old_ptr, size_t new_size,
        } else {
                size_t old_size = sallocx(old_ptr, flags | ctx->jemalloc_flags);
 
-               DELETE_TRACE(ctx, old_ptr, old_size, file, line);
+               DELETE_TRACE(ctx, old_ptr, old_size, func, file, line);
                mem_putstats(ctx, old_size);
 
                new_ptr = mem_realloc(ctx, old_ptr, old_size, new_size, flags);
@@ -754,7 +757,7 @@ isc__mem_reallocate(isc_mem_t *ctx, void *old_ptr, size_t new_size,
                new_size = sallocx(new_ptr, flags | ctx->jemalloc_flags);
 
                mem_getstats(ctx, new_size);
-               ADD_TRACE(ctx, new_ptr, new_size, file, line);
+               ADD_TRACE(ctx, new_ptr, new_size, func, file, line);
 
                /*
                 * We want to postpone the call to water in edge case
@@ -775,7 +778,7 @@ isc__mem_free(isc_mem_t *ctx, void *ptr, int flags FLARG) {
 
        size = sallocx(ptr, flags | ctx->jemalloc_flags);
 
-       DELETE_TRACE(ctx, ptr, size, file, line);
+       DELETE_TRACE(ctx, ptr, size, func, file, line);
 
        mem_putstats(ctx, size);
        mem_put(ctx, ptr, size, flags);
@@ -960,8 +963,9 @@ isc__mempool_create(isc_mem_t *restrict mctx, const size_t element_size,
 
 #if ISC_MEM_TRACKLINES
        if ((mctx->debugging & ISC_MEM_DEBUGTRACE) != 0) {
-               fprintf(stderr, "create pool %p file %s line %u mctx %p\n",
-                       mpctx, file, line, mctx);
+               fprintf(stderr,
+                       "create pool %p func %s file %s line %u mctx %p\n",
+                       mpctx, func, file, line, mctx);
        }
 #endif /* ISC_MEM_TRACKLINES */
 
@@ -1000,8 +1004,9 @@ isc__mempool_destroy(isc_mempool_t **restrict mpctxp FLARG) {
 
 #if ISC_MEM_TRACKLINES
        if ((mctx->debugging & ISC_MEM_DEBUGTRACE) != 0) {
-               fprintf(stderr, "destroy pool %p file %s line %u mctx %p\n",
-                       mpctx, file, line, mctx);
+               fprintf(stderr,
+                       "destroy pool %p func %s file %s line %u mctx %p\n",
+                       mpctx, func, file, line, mctx);
        }
 #endif
 
@@ -1073,7 +1078,7 @@ isc__mempool_get(isc_mempool_t *restrict mpctx FLARG) {
        mpctx->freecount--;
        mpctx->gets++;
 
-       ADD_TRACE(mpctx->mctx, item, mpctx->size, file, line);
+       ADD_TRACE(mpctx->mctx, item, mpctx->size, func, file, line);
 
        return item;
 }
@@ -1097,7 +1102,7 @@ isc__mempool_put(isc_mempool_t *restrict mpctx, void *mem FLARG) {
        INSIST(mpctx->allocated > 0);
        mpctx->allocated--;
 
-       DELETE_TRACE(mctx, mem, mpctx->size, file, line);
+       DELETE_TRACE(mctx, mem, mpctx->size, func, file, line);
 
        /*
         * If our free list is full, return this to the mctx directly.
@@ -1432,8 +1437,8 @@ isc__mem_create(isc_mem_t **mctxp FLARG) {
        mem_create(mctxp, isc_mem_debugging, isc_mem_defaultflags, 0);
 #if ISC_MEM_TRACKLINES
        if ((isc_mem_debugging & ISC_MEM_DEBUGTRACE) != 0) {
-               fprintf(stderr, "create mctx %p file %s line %u\n", *mctxp,
-                       file, line);
+               fprintf(stderr, "create mctx %p func %s file %s line %u\n",
+                       *mctxp, func, file, line);
        }
 #endif /* ISC_MEM_TRACKLINES */
 }
@@ -1459,9 +1464,9 @@ isc__mem_create_arena(isc_mem_t **mctxp FLARG) {
 #if ISC_MEM_TRACKLINES
        if ((isc_mem_debugging & ISC_MEM_DEBUGTRACE) != 0) {
                fprintf(stderr,
-                       "create mctx %p file %s line %u for jemalloc arena "
-                       "%u\n",
-                       *mctxp, file, line, arena_no);
+                       "create mctx %p func %s file %s line %u "
+                       "for jemalloc arena %u\n",
+                       *mctxp, func, file, line, arena_no);
        }
 #endif /* ISC_MEM_TRACKLINES */
 }
index 7e637d0a1d7cb648078755b0a65c8364bbc904ef..d1db14539e05fe3da21ea6c210c1e647f2643fef 100644 (file)
@@ -17,8 +17,8 @@
 $mem_stats = '';
 
 while (<>) {
-    $gets{$1.$2} = $_ if (/add (?:0x)?([0-9a-f]+) size (?:0x)?([0-9]+) file/);
-    delete $gets{$1.$2} if /del (?:0x)?([0-9a-f]+) size (?:0x)?([0-9]+) file/;
+    $gets{$1.$2} = $_ if (/add (?:0x)?([0-9a-f]+) size (?:0x)?([0-9]+) func/);
+    delete $gets{$1.$2} if /del (?:0x)?([0-9a-f]+) size (?:0x)?([0-9]+) func/;
     $mem_stats .= $_ if /\d+ gets, +(\d+) rem/ && $1 > 0;
 }
 print join('', values %gets);