diff options
author | Jeff Darcy <jdarcy@redhat.com> | 2015-10-06 13:19:01 -0400 |
---|---|---|
committer | Vijay Bellur <vbellur@redhat.com> | 2015-10-22 22:51:44 -0700 |
commit | fb2a511493868a9ff0c2926537a4d1d23821ce38 (patch) | |
tree | 2e99e23b42cc48915d6bf19cc8e235879f2925c9 /libglusterfs/src/gen-defaults.py | |
parent | 594a03b030577bf0ed6960199e920cc5fa7e7afc (diff) |
libglusterfs: replace default functions with generated versions
Replacing repetitive code like this with code generated from a more
compact "canonical" definition carries several advantages.
* Ease the process of adding new fops (e.g. GF_FOP_IPC).
* Ease the process of making global changes to existing fops (e.g.
adding "xdata").
* Ensure strict consistency between all of the pieces that must be
compatible with each other, through both kinds of changes.
What we have right now is just a start. The above benefits will only
truly be realized when we use the same definitions to generate stubs,
syncops, and perhaps even parts of gfapi or glupy.
This same infrastructure can also be used to reduce code duplication and
potential for error in many of our translators. NSR already uses a
similar technique, using a few hundred lines of templates to generate a
few *thousand* lines of code. The ability to make a global "aspect"
change (e.g. to quorum checking) in one place instead of seventy has
already been demonstrated there.
Other candidates for code generation include the AFR/EC transaction
infrastructure, or stub creation/resumption in io-threads.
Change-Id: If7d59de7a088848b557f5aea00741b4fe19017c1
BUG: 1271325
Signed-off-by: Jeff Darcy <jdarcy@redhat.com>
Reviewed-on: http://review.gluster.org/9411
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Tested-by: NetBSD Build System <jenkins@build.gluster.org>
Reviewed-by: Shyamsundar Ranganathan <srangana@redhat.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'libglusterfs/src/gen-defaults.py')
-rw-r--r-- | libglusterfs/src/gen-defaults.py | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/libglusterfs/src/gen-defaults.py b/libglusterfs/src/gen-defaults.py new file mode 100644 index 00000000000..f8e76d02ef4 --- /dev/null +++ b/libglusterfs/src/gen-defaults.py @@ -0,0 +1,80 @@ +#!/usr/bin/python + +import sys +from generator import ops, fop_subs, cbk_subs, generate + +FAILURE_CBK_TEMPLATE = """ +int32_t +default_@NAME@_failure_cbk (call_frame_t *frame, int32_t op_errno) +{ + STACK_UNWIND_STRICT (@NAME@, frame, -1, op_errno, @ERROR_ARGS@); + return 0; +} +""" + +CBK_RESUME_TEMPLATE = """ +int32_t +default_@NAME@_cbk_resume (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, @LONG_ARGS@) +{ + STACK_UNWIND_STRICT (@NAME@, frame, op_ret, op_errno, + @SHORT_ARGS@); + return 0; +} +""" + +CBK_TEMPLATE = """ +int32_t +default_@NAME@_cbk (call_frame_t *frame, void *cookie, xlator_t *this, + int32_t op_ret, int32_t op_errno, @LONG_ARGS@) +{ + STACK_UNWIND_STRICT (@NAME@, frame, op_ret, op_errno, + @SHORT_ARGS@); + return 0; +} +""" + +RESUME_TEMPLATE = """ +int32_t +default_@NAME@_resume (call_frame_t *frame, xlator_t *this, @LONG_ARGS@) +{ + STACK_WIND (frame, default_@NAME@_cbk, + FIRST_CHILD(this), FIRST_CHILD(this)->fops->@NAME@, + @SHORT_ARGS@); + return 0; +} +""" + +FOP_TEMPLATE = """ +int32_t +default_@NAME@ ( + call_frame_t *frame, + xlator_t *this, + @LONG_ARGS@) +{ + STACK_WIND_TAIL (frame, + FIRST_CHILD(this), FIRST_CHILD(this)->fops->@NAME@, + @SHORT_ARGS@); + return 0; +} +""" + +def gen_defaults (): + for name in ops.iterkeys(): + print generate(FAILURE_CBK_TEMPLATE,name,cbk_subs) + for name in ops.iterkeys(): + print generate(CBK_RESUME_TEMPLATE,name,cbk_subs) + for name in ops.iterkeys(): + print generate(CBK_TEMPLATE,name,cbk_subs) + for name in ops.iterkeys(): + print generate(RESUME_TEMPLATE,name,fop_subs) + for name in ops.iterkeys(): + print generate(FOP_TEMPLATE,name,fop_subs) + +for l in open(sys.argv[1],'r').readlines(): + if l.find('#pragma generate') != -1: + print "/* BEGIN GENERATED CODE - DO NOT MODIFY */" + gen_defaults() + print "/* END GENERATED CODE */" + else: + print l[:-1] |