diff options
author | N Balachandran <nbalacha@redhat.com> | 2017-12-06 14:23:06 +0530 |
---|---|---|
committer | N Balachandran <nbalacha@redhat.com> | 2017-12-07 14:57:27 +0530 |
commit | 47d01546a1826dc14a8331ea8700015f1cfdc4db (patch) | |
tree | 5035cc46b488dbf054bf774c4e57965f44bb9c7f /libglusterfs | |
parent | 36ce4c614a3391043a3417aa061d0aa16e60b2d3 (diff) |
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 <nbalacha@redhat.com>
Diffstat (limited to 'libglusterfs')
-rw-r--r-- | libglusterfs/src/mem-pool.c | 34 | ||||
-rw-r--r-- | libglusterfs/src/mem-pool.h | 6 | ||||
-rw-r--r-- | libglusterfs/src/xlator.c | 3 |
3 files changed, 42 insertions, 1 deletions
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); diff --git a/libglusterfs/src/mem-pool.h b/libglusterfs/src/mem-pool.h index e68e00dfca1..a2a907a2344 100644 --- a/libglusterfs/src/mem-pool.h +++ b/libglusterfs/src/mem-pool.h @@ -46,6 +46,9 @@ struct mem_acct_rec { uint32_t total_allocs; uint32_t max_num_allocs; gf_lock_t lock; +#ifdef DEBUG + struct list_head obj_list; +#endif }; struct mem_acct { @@ -59,6 +62,9 @@ struct mem_header { size_t size; struct mem_acct *mem_acct; uint32_t magic; +#ifdef DEBUG + struct list_head acct_list; +#endif int padding[8]; }; diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c index a342bbd7f33..3e9814ca19b 100644 --- a/libglusterfs/src/xlator.c +++ b/libglusterfs/src/xlator.c @@ -802,6 +802,9 @@ xlator_mem_acct_init (xlator_t *xl, int num_types) if (ret) { fprintf(stderr, "Unable to lock..errno : %d",errno); } +#ifdef DEBUG + INIT_LIST_HEAD(&(xl->mem_acct->rec[i].obj_list)); +#endif } return 0; |