diff options
Diffstat (limited to 'libglusterfs/src/xlator.c')
| -rw-r--r-- | libglusterfs/src/xlator.c | 42 | 
1 files changed, 23 insertions, 19 deletions
diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c index c670ee97aee..628f3499956 100644 --- a/libglusterfs/src/xlator.c +++ b/libglusterfs/src/xlator.c @@ -509,16 +509,22 @@ xlator_mem_acct_init (xlator_t *xl, int num_types)          if (!xl->ctx->mem_acct_enable)                  return 0; -        xl->mem_acct.num_types = num_types; -        xl->mem_acct.rec = CALLOC(num_types, sizeof(struct mem_acct_rec)); +        xl->mem_acct = MALLOC (sizeof(struct mem_acct) +                               + sizeof(struct mem_acct_rec) * num_types); -        if (!xl->mem_acct.rec) { +        if (!xl->mem_acct) {                  return -1;          } +        memset (xl->mem_acct, 0, sizeof(struct mem_acct)); + +        xl->mem_acct->num_types = num_types; +        LOCK_INIT (&xl->mem_acct->lock); +        xl->mem_acct->refcnt = 1;          for (i = 0; i < num_types; i++) { -                ret = LOCK_INIT(&(xl->mem_acct.rec[i].lock)); +                memset (&xl->mem_acct->rec[i], 0, sizeof(struct mem_acct_rec)); +                ret = LOCK_INIT(&(xl->mem_acct->rec[i].lock));                  if (ret) {                          fprintf(stderr, "Unable to lock..errno : %d",errno);                  } @@ -559,17 +565,22 @@ xlator_list_destroy (xlator_list_t *list)  static int  xlator_memrec_free (xlator_t *xl)  { -        uint32_t i = 0; +        uint32_t        i               = 0; +        struct mem_acct *mem_acct       = NULL; -        if (!xl) +        if (!xl) {                  return 0; +        } +        mem_acct = xl->mem_acct; -        if (xl->mem_acct.rec) { -                for (i = 0; i < xl->mem_acct.num_types; i++) { -                        LOCK_DESTROY (&(xl->mem_acct.rec[i].lock)); +        if (mem_acct) { +                for (i = 0; i < mem_acct->num_types; i++) { +                        LOCK_DESTROY (&(mem_acct->rec[i].lock)); +                } +                if (DECREMENT_ATOMIC (mem_acct->lock, mem_acct->refcnt) == 0) { +                        FREE (mem_acct); +                        xl->mem_acct = NULL;                  } -                FREE (xl->mem_acct.rec); -                xl->mem_acct.rec = NULL;          }          return 0; @@ -653,7 +664,6 @@ xlator_tree_free_memacct (xlator_t *tree)  {          xlator_t *trav = tree;          xlator_t *prev = tree; -        int          i = 0;          if (!tree) {                  gf_log ("parser", GF_LOG_ERROR, "Translator tree not found"); @@ -662,13 +672,7 @@ xlator_tree_free_memacct (xlator_t *tree)          while (prev) {                  trav = prev->next; -                if (prev->mem_acct.rec) { -                        for (i = 0; i < prev->mem_acct.num_types; i++) { -                                LOCK_DESTROY (&(prev->mem_acct.rec[i].lock)); -                        } -                        FREE (prev->mem_acct.rec); -                } -                GF_FREE (prev); +                xlator_memrec_free (prev);                  prev = trav;          }  | 
