From: Arran Cudbard-Bell Date: Mon, 2 Sep 2019 03:59:55 +0000 (-0400) Subject: Start removing stupid inst->name boilerplate from all the modules X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2da2e5ce6332c83de8b0da53cedaabca3eed0df6;p=thirdparty%2Ffreeradius-server.git Start removing stupid inst->name boilerplate from all the modules --- diff --git a/src/lib/server/dl_module.c b/src/lib/server/dl_module.c index 8e75c6fcf39..42bfe66129c 100644 --- a/src/lib/server/dl_module.c +++ b/src/lib/server/dl_module.c @@ -52,6 +52,16 @@ struct dl_module_loader_s { static dl_module_loader_t *dl_module_loader; +/** Make data to instance name resolution more efficient + * + */ +typedef struct { + void *data; //!< Module's data. + dl_module_inst_t *inst; //!< Instance wrapper struct. +} dl_module_inst_cache_t; + +static _Thread_local dl_module_inst_cache_t dl_inst_cache; + /** Modules which need RTLD_GLOBAL set * */ @@ -190,9 +200,24 @@ dl_module_inst_t const *dl_module_instance_by_data(void const *data) memcpy(&mutable, &data, sizeof(mutable)); + if (dl_inst_cache.data == data) return dl_inst_cache.inst; + return rbtree_finddata(dl_module_loader->inst_data_tree, &(dl_module_inst_t){ .data = mutable }); } +/** Lookup instance name via instance data + * + */ +char const *dl_module_instance_name_by_data(void const *data) +{ + dl_module_inst_t const *inst; + + inst = dl_module_instance_by_data(data); + if (!inst) return NULL; + + return inst->name; +} + /** A convenience function for returning a parent's private data * * @param[in] data Private instance data for child. @@ -319,7 +344,8 @@ dl_module_t const *dl_module(CONF_SECTION *conf, dl_module_t const *parent, char if (parent) { module_name = talloc_typed_asprintf(NULL, "%s_%s_%s", - fr_table_str_by_value(dl_module_type_prefix, parent->type, ""), + fr_table_str_by_value(dl_module_type_prefix, + parent->type, ""), parent->common->name, name); } else { module_name = talloc_typed_asprintf(NULL, "%s_%s", diff --git a/src/lib/server/dl_module.h b/src/lib/server/dl_module.h index e9438fecac9..ceb93322f16 100644 --- a/src/lib/server/dl_module.h +++ b/src/lib/server/dl_module.h @@ -162,6 +162,8 @@ dl_module_t const *dl_module(CONF_SECTION *conf, dl_module_t const *parent, dl_module_inst_t const *dl_module_instance_by_data(void const *data); +char const *dl_module_instance_name_by_data(void const *data); + void *dl_module_parent_data_by_child_data(void const *data); void *dl_module_instance_symbol(dl_module_inst_t const *instance, char const *sym_name); diff --git a/src/modules/rlm_always/rlm_always.c b/src/modules/rlm_always/rlm_always.c index 13d903216da..57bdfb20c55 100644 --- a/src/modules/rlm_always/rlm_always.c +++ b/src/modules/rlm_always/rlm_always.c @@ -25,7 +25,7 @@ RCSID("$Id$") #define LOG_PREFIX "rlm_always (%s) - " -#define LOG_PREFIX_ARGS inst->name +#define LOG_PREFIX_ARGS dl_module_instance_name_by_data(inst) #include #include @@ -35,7 +35,6 @@ RCSID("$Id$") * going to return. */ typedef struct { - char const *name; //!< Name of this instance of the always module. char const *rcode_str; //!< The base value. rlm_rcode_t rcode; //!< The integer constant representing rcode_str. @@ -57,8 +56,6 @@ static int mod_instantiate(void *instance, CONF_SECTION *conf) { rlm_always_t *inst = instance; - inst->name = cf_section_name1(conf); - if (!inst->name) inst->name = cf_section_name2(conf); /* * Convert the rcode string to an int */