summaryrefslogtreecommitdiffstats
path: root/libglusterfs/src/compound-fop-utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'libglusterfs/src/compound-fop-utils.c')
-rw-r--r--libglusterfs/src/compound-fop-utils.c104
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)