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>
This commit is contained in:
parent
6fc4820ae8
commit
42a9d608d5
@ -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"))) {
|
||||
|
@ -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 ...) \
|
||||
|
Loading…
x
Reference in New Issue
Block a user