diff options
Diffstat (limited to 'libglusterfs/src/compound-fop-utils.c')
-rw-r--r-- | libglusterfs/src/compound-fop-utils.c | 104 |
1 files changed, 85 insertions, 19 deletions
diff --git a/libglusterfs/src/compound-fop-utils.c b/libglusterfs/src/compound-fop-utils.c index 16cd5c690e5..03d7b5ba459 100644 --- a/libglusterfs/src/compound-fop-utils.c +++ b/libglusterfs/src/compound-fop-utils.c @@ -13,12 +13,94 @@ #include "mem-types.h" #include "dict.h" +void +compound_args_cleanup (compound_args_t *args) +{ + int i; + + if (!args) + return; + + if (args->xdata) + dict_unref (args->xdata); + + if (args->req_list) { + for (i = 0; i < args->fop_length; i++) { + args_wipe (&args->req_list[i]); + } + } + + GF_FREE (args->enum_list); + GF_FREE (args->req_list); + GF_FREE (args); +} + +void +compound_args_cbk_cleanup (compound_args_cbk_t *args_cbk) +{ + int i; + + if (!args_cbk) + return; + + if (args_cbk->xdata) + dict_unref (args_cbk->xdata); + + if (args_cbk->rsp_list) { + for (i = 0; i < args_cbk->fop_length; i++) { + args_cbk_wipe (&args_cbk->rsp_list[i]); + } + } + + GF_FREE (args_cbk->rsp_list); + GF_FREE (args_cbk->enum_list); + GF_FREE (args_cbk); +} + +compound_args_cbk_t* +compound_args_cbk_alloc (int length, dict_t *xdata) +{ + int i = 0; + compound_args_cbk_t *args_cbk = NULL; + + args_cbk = GF_CALLOC (1, sizeof (*args_cbk), gf_mt_compound_rsp_t); + if (!args_cbk) + return NULL; + + args_cbk->fop_length = length; + + args_cbk->rsp_list = GF_CALLOC (length, sizeof (*args_cbk->rsp_list), + gf_mt_default_args_cbk_t); + if (!args_cbk->rsp_list) + goto out; + + for (i = 0; i < length; i++) { + args_cbk_init (&args_cbk->rsp_list[i]); + } + + args_cbk->enum_list = GF_CALLOC (length, sizeof (*args_cbk->enum_list), + gf_common_mt_int); + if (!args_cbk->enum_list) + goto out; + + if (xdata) { + args_cbk->xdata = dict_copy_with_ref (xdata, NULL); + if (!args_cbk->xdata) + goto out; + } + + return args_cbk; +out: + compound_args_cbk_cleanup (args_cbk); + return NULL; +} + compound_args_t* compound_fop_alloc (int length, glusterfs_compound_fop_t fop, dict_t *xdata) { compound_args_t *args = NULL; - args = GF_CALLOC (1, sizeof (args), gf_mt_compound_req_t); + args = GF_CALLOC (1, sizeof (*args), gf_mt_compound_req_t); if (!args) return NULL; @@ -29,7 +111,7 @@ compound_fop_alloc (int length, glusterfs_compound_fop_t fop, dict_t *xdata) * fop list packed. */ args->fop_enum = fop; - args->fop_length = length; + args->fop_length = length; args->enum_list = GF_CALLOC (length, sizeof (*args->enum_list), gf_common_mt_int); @@ -51,22 +133,6 @@ compound_fop_alloc (int length, glusterfs_compound_fop_t fop, dict_t *xdata) return args; out: - if (args->xdata) - dict_unref (args->xdata); - - if (args->req_list) - GF_FREE (args->req_list); - - if (args->enum_list) - GF_FREE (args->enum_list); - - if (args) - GF_FREE (args); - + compound_args_cleanup (args); return NULL; } - -#define COMPOUND_PACK_ARGS(fop, fop_enum, args, counter, params ...) do { \ - args->enum_list[counter] = fop_enum; \ - args_##fop##_store (&args->req_list[counter], params); \ -} while (0) |