From fa0f802e9042afb9142378943397d45f727bb86a Mon Sep 17 00:00:00 2001 From: Daniel-Constantin Mierla Date: Wed, 9 Mar 2022 11:46:14 +0100 Subject: [PATCH] mem: store file, line, module and functions in memory reports --- src/core/mem/meminfo.h | 28 ++++++++++++++++++++++++---- src/core/mem/q_malloc.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 4 deletions(-) diff --git a/src/core/mem/meminfo.h b/src/core/mem/meminfo.h index 8e629a8a505..e0e0d7ca38f 100644 --- a/src/core/mem/meminfo.h +++ b/src/core/mem/meminfo.h @@ -56,20 +56,40 @@ typedef struct _mem_counter{ /** Memory report structure */ typedef struct mem_report { - unsigned long total_size; /** total size of memory pool */ + unsigned long total_size; /** total size of memory pool */ unsigned long free_size_s; /** free memory (stats) */ unsigned long free_size_m; /** free memory (measured) */ unsigned long used_size_s; /** allocated size (stats) */ unsigned long used_size_m; /** allocated size (measured) */ unsigned long real_used_s; /** used size plus overhead from malloc */ - unsigned long max_used_s; /** maximum used size since server start? */ - unsigned long free_frags; /** number of total free memory fragments */ - unsigned long used_frags; /** number of total used memory fragments */ + unsigned long max_used_s; /** maximum used size since server start? */ + unsigned long free_frags; /** number of total free memory fragments */ + unsigned long used_frags; /** number of total used memory fragments */ unsigned long total_frags; /** number of total memory fragments */ + unsigned long max_free_frag_size; + const char *max_free_frag_file; + const char *max_free_frag_func; + const char *max_free_frag_mname; + unsigned long max_free_frag_line; + unsigned long min_free_frag_size; + const char *min_free_frag_file; + const char *min_free_frag_func; + const char *min_free_frag_mname; + unsigned long min_free_frag_line; + unsigned long max_used_frag_size; + const char *max_used_frag_file; + const char *max_used_frag_func; + const char *max_used_frag_mname; + unsigned long max_used_frag_line; + unsigned long min_used_frag_size; + const char *min_used_frag_file; + const char *min_used_frag_func; + const char *min_used_frag_mname; + unsigned long min_used_frag_line; } mem_report_t; #endif diff --git a/src/core/mem/q_malloc.c b/src/core/mem/q_malloc.c index c31d1c9d2fd..69de680d765 100644 --- a/src/core/mem/q_malloc.c +++ b/src/core/mem/q_malloc.c @@ -1051,16 +1051,32 @@ void qm_report(void* qmp, mem_report_t *mrep) mrep->free_size_m += f->size; if(mrep->max_free_frag_size==0) { mrep->max_free_frag_size = f->size; + mrep->max_free_frag_file = f->file; + mrep->max_free_frag_func = f->func; + mrep->max_free_frag_mname = f->mname; + mrep->max_free_frag_line = f->line; } else { if(f->size > mrep->max_free_frag_size) { mrep->max_free_frag_size = f->size; + mrep->max_free_frag_file = f->file; + mrep->max_free_frag_func = f->func; + mrep->max_free_frag_mname = f->mname; + mrep->max_free_frag_line = f->line; } } if(mrep->min_free_frag_size==0) { mrep->min_free_frag_size = f->size; + mrep->min_free_frag_file = f->file; + mrep->min_free_frag_func = f->func; + mrep->min_free_frag_mname = f->mname; + mrep->min_free_frag_line = f->line; } else { if(f->size < mrep->min_free_frag_size) { mrep->min_free_frag_size = f->size; + mrep->min_free_frag_file = f->file; + mrep->min_free_frag_func = f->func; + mrep->min_free_frag_mname = f->mname; + mrep->min_free_frag_line = f->line; } } } else { @@ -1068,16 +1084,33 @@ void qm_report(void* qmp, mem_report_t *mrep) mrep->used_size_m += f->size; if(mrep->max_used_frag_size==0) { mrep->max_used_frag_size = f->size; + mrep->max_used_frag_file = f->file; + mrep->max_used_frag_func = f->func; + mrep->max_used_frag_mname = f->mname; + mrep->max_used_frag_line = f->line; } else { if(f->size > mrep->max_used_frag_size) { mrep->max_used_frag_size = f->size; + mrep->max_used_frag_size = f->size; + mrep->max_used_frag_file = f->file; + mrep->max_used_frag_func = f->func; + mrep->max_used_frag_mname = f->mname; + mrep->max_used_frag_line = f->line; } } if(mrep->min_used_frag_size==0) { mrep->min_used_frag_size = f->size; + mrep->min_used_frag_file = f->file; + mrep->min_used_frag_func = f->func; + mrep->min_used_frag_mname = f->mname; + mrep->min_used_frag_line = f->line; } else { if(f->size < mrep->min_used_frag_size) { mrep->min_used_frag_size = f->size; + mrep->min_used_frag_file = f->file; + mrep->min_used_frag_func = f->func; + mrep->min_used_frag_mname = f->mname; + mrep->min_used_frag_line = f->line; } } }