From 47d01546a1826dc14a8331ea8700015f1cfdc4db Mon Sep 17 00:00:00 2001 From: N Balachandran Date: Wed, 6 Dec 2017 14:23:06 +0530 Subject: core/memacct: save allocs in mem_acct_rec list With configure --enable-debug, add all object allocations to a list in the corresponding mem_acct_rec. This allows us to see all objects of a particular type and allows for additional debugging in case of memory leaks. This is not compiled in by default and must be explicitly enabled. It is intended to be used by developers. Change-Id: I7cf2dbeadecf994423d7e7591e85f18d2575cce8 BUG: 1522662 Signed-off-by: N Balachandran --- libglusterfs/src/mem-pool.c | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) (limited to 'libglusterfs/src/mem-pool.c') diff --git a/libglusterfs/src/mem-pool.c b/libglusterfs/src/mem-pool.c index a972f67bb17..252bae5d7e3 100644 --- a/libglusterfs/src/mem-pool.c +++ b/libglusterfs/src/mem-pool.c @@ -78,8 +78,16 @@ gf_mem_set_acct_info (xlator_t *xl, char **alloc_ptr, size_t size, header->mem_acct = xl->mem_acct; header->magic = GF_MEM_HEADER_MAGIC; +#ifdef DEBUG + INIT_LIST_HEAD(&header->acct_list); + LOCK(&xl->mem_acct->rec[type].lock); + { + list_add (&header->acct_list, + &(xl->mem_acct->rec[type].obj_list)); + } + UNLOCK(&xl->mem_acct->rec[type].lock); +#endif ptr += sizeof (struct mem_header); - /* data follows in this gap of 'size' bytes */ *(uint32_t *) (ptr + size) = GF_MEM_TRAILER_MAGIC; @@ -157,6 +165,27 @@ __gf_realloc (void *ptr, size_t size) GF_ASSERT (old_header->magic == GF_MEM_HEADER_MAGIC); tmp_header = *old_header; +#ifdef DEBUG + int type = 0; + size_t copy_size = 0; + + /* Making these changes for realloc is not straightforward. So + * I am simulating realloc using calloc and free + */ + + type = tmp_header.type; + new_ptr = __gf_calloc (1, size, type, + tmp_header.mem_acct->rec[type].typestr); + if (new_ptr) { + copy_size = (size > tmp_header.size) ? tmp_header.size : size; + memcpy (new_ptr, ptr, copy_size); + __gf_free (ptr); + } + + /* This is not quite what the man page says should happen */ + return new_ptr; +#endif + tot_size = size + GF_MEM_HEADER_SIZE + GF_MEM_TRAILER_SIZE; new_ptr = realloc (old_header, tot_size); if (!new_ptr) { @@ -313,6 +342,9 @@ __gf_free (void *free_ptr) * to NULL */ if (!mem_acct->rec[header->type].num_allocs) mem_acct->rec[header->type].typestr = NULL; +#ifdef DEBUG + list_del (&header->acct_list); +#endif } UNLOCK (&mem_acct->rec[header->type].lock); -- cgit