diff options
| author | Jeff Darcy <jdarcy@redhat.com> | 2013-03-21 19:02:52 -0400 | 
|---|---|---|
| committer | Anand Avati <avati@redhat.com> | 2013-04-03 15:14:27 -0700 | 
| commit | 42a9d608d5acbe8526050d23682071171d65da3b (patch) | |
| tree | c4804c796c68ba9ad7bf8ef264ec4cf4eb66383a /libglusterfs | |
| parent | 6fc4820ae8d8f06c05616a4ac3cc8f296ce42ecf (diff) | |
core: add dispatch table for init/fini
This adds a layer of indirection so that derivative translators such as
NUFA and switch can refer to the parent's init/fini (in both cases DHT's)
without having to create stub functions.
Change-Id: I1af1fea70a9ddd2aa20485af7ae65f9660f19dd6
BUG: 924490
Signed-off-by: Jeff Darcy <jdarcy@redhat.com>
Reviewed-on: http://review.gluster.org/4709
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@redhat.com>
Diffstat (limited to 'libglusterfs')
| -rw-r--r-- | libglusterfs/src/xlator.c | 32 | ||||
| -rw-r--r-- | libglusterfs/src/xlator.h | 5 | 
2 files changed, 27 insertions, 10 deletions
diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c index 9bde4fa8f6c..da5501b2cfa 100644 --- a/libglusterfs/src/xlator.c +++ b/libglusterfs/src/xlator.c @@ -183,7 +183,7 @@ xlator_dynload (xlator_t *xl)          char              *name = NULL;          void              *handle = NULL;          volume_opt_list_t *vol_opt = NULL; - +        class_methods_t   *vtbl = NULL;          GF_VALIDATE_OR_GOTO ("xlator", xl, out); @@ -218,16 +218,28 @@ xlator_dynload (xlator_t *xl)                  goto out;          } -        if (!(*VOID(&xl->init) = dlsym (handle, "init"))) { -                gf_log ("xlator", GF_LOG_WARNING, "dlsym(init) on %s", -                        dlerror ()); -                goto out; -        } +        /* +         * If class_methods exists, its contents override any definitions of +         * init or fini for that translator.  Otherwise, we fall back to the +         * older method of looking for init and fini directly. +         */ +        vtbl = dlsym(handle,"class_methods"); +        if (vtbl) { +                xl->init = vtbl->init; +                xl->fini = vtbl->fini; +        } +        else { +                if (!(*VOID(&xl->init) = dlsym (handle, "init"))) { +                        gf_log ("xlator", GF_LOG_WARNING, "dlsym(init) on %s", +                                dlerror ()); +                        goto out; +                } -        if (!(*VOID(&(xl->fini)) = dlsym (handle, "fini"))) { -                gf_log ("xlator", GF_LOG_WARNING, "dlsym(fini) on %s", -                        dlerror ()); -                goto out; +                if (!(*VOID(&(xl->fini)) = dlsym (handle, "fini"))) { +                        gf_log ("xlator", GF_LOG_WARNING, "dlsym(fini) on %s", +                                dlerror ()); +                        goto out; +                }          }          if (!(*VOID(&(xl->notify)) = dlsym (handle, "notify"))) { diff --git a/libglusterfs/src/xlator.h b/libglusterfs/src/xlator.h index 607f0dcecee..2567fc70c48 100644 --- a/libglusterfs/src/xlator.h +++ b/libglusterfs/src/xlator.h @@ -827,6 +827,11 @@ struct _xlator {          gf_boolean_t        is_autoloaded;  }; +typedef struct { +        int32_t (*init) (xlator_t *this); +        void    (*fini) (xlator_t *this); +} class_methods_t; +  #define xlator_has_parent(xl) (xl->parents != NULL)  #define XLATOR_NOTIFY(_xl, params ...)          \  | 
