diff options
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;  | 
