summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVikas Gorur <vikas@gluster.com>2009-10-05 05:37:31 +0000
committerAnand V. Avati <avati@dev.gluster.com>2009-10-05 05:16:51 -0700
commit97b564c708fbb44cf1ac512d7eaca701767120d5 (patch)
treede605c7208cc9134619e243f9913c52058ddec4d
parent7e6c9643e69e1f8172e5be3564213d35332ae099 (diff)
libglusterfs: Add STACK_UNWIND_STRICT macro.
STACK_UNWIND_STRICT (op, frame, this, op_ret, op_errno, ...) The "op" argument is the name of the fop (lookup, open, etc.). This macro makes sure that the number and type of arguments passed match those of the callback function for the fop. Signed-off-by: Anand V. Avati <avati@dev.gluster.com> BUG: 269 (Add a specialized STACK_UNWIND macro for each FOP) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=269
-rw-r--r--libglusterfs/src/stack.h18
1 files changed, 18 insertions, 0 deletions
diff --git a/libglusterfs/src/stack.h b/libglusterfs/src/stack.h
index 942972556..e03f95ca1 100644
--- a/libglusterfs/src/stack.h
+++ b/libglusterfs/src/stack.h
@@ -215,6 +215,24 @@ STACK_DESTROY (call_stack_t *stack)
} while (0)
+/* return from function in type-safe way */
+#define STACK_UNWIND_STRICT(op, frame, params ...) \
+ do { \
+ fop_##op##_cbk_t fn = NULL; \
+ call_frame_t *_parent = NULL; \
+ xlator_t *old_THIS = NULL; \
+ \
+ fn = (fop_##op##_cbk_t )frame->ret; \
+ _parent = frame->parent; \
+ _parent->ref_count--; \
+ old_THIS = THIS; \
+ THIS = _parent->this; \
+ frame->complete = _gf_true; \
+ fn (_parent, frame->cookie, _parent->this, params); \
+ THIS = old_THIS; \
+ } while (0)
+
+
static inline call_frame_t *
copy_frame (call_frame_t *frame)
{