Add module support level to ast_module_info structure. Print it in CLI "module show" .

ASTERISK-23919 #close
Reported by Malcolm Davenport

Review: https://reviewboard.asterisk.org/r/3802



git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@419592 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Mark Michelson
2014-07-25 16:47:17 +00:00
parent 355dc3d2ad
commit dcf1ad14da
241 changed files with 386 additions and 77 deletions

View File

@@ -73,6 +73,13 @@ enum ast_module_load_result {
AST_MODULE_LOAD_FAILURE = -1, /*!< Module could not be loaded properly */
};
enum ast_module_support_level {
AST_MODULE_SUPPORT_UNKNOWN,
AST_MODULE_SUPPORT_CORE,
AST_MODULE_SUPPORT_EXTENDED,
AST_MODULE_SUPPORT_DEPRECATED,
};
/*!
* \brief Load a module.
* \param resource_name The name of the module to load.
@@ -120,8 +127,10 @@ void ast_update_use_count(void);
*
* \return the number of modules loaded
*/
int ast_update_module_list(int (*modentry)(const char *module, const char *description, int usecnt, const char *status, const char *like),
const char *like);
int ast_update_module_list(int (*modentry)(const char *module, const char *description,
int usecnt, const char *status, const char *like,
enum ast_module_support_level support_level),
const char *like);
/*!
* \brief Check if module with the name given is loaded
@@ -264,6 +273,8 @@ struct ast_module_info {
* These are only required for loading, when the optional_api header file
* detects that the compiler does not support the optional API featureset. */
const char *nonoptreq;
/*! The support level for the given module */
enum ast_module_support_level support_level;
};
void ast_module_register(const struct ast_module_info *);
@@ -281,38 +292,59 @@ struct ast_module *ast_module_ref(struct ast_module *);
void ast_module_unref(struct ast_module *);
#if defined(__cplusplus) || defined(c_plusplus)
#define AST_MODULE_INFO(keystr, flags_to_set, desc, load_func, unload_func, reload_func, load_pri) \
#define AST_MODULE_INFO(keystr, flags_to_set, desc, load_func, unload_func, reload_func, load_pri, support_level) \
static struct ast_module_info __mod_info = { \
NULL, \
load_func, \
reload_func, \
unload_func, \
NULL, \
NULL, \
AST_MODULE, \
desc, \
keystr, \
flags_to_set, \
AST_BUILDOPT_SUM, \
load_pri, \
}; \
static void __attribute__((constructor)) __reg_module(void) \
{ \
ast_module_register(&__mod_info); \
} \
static void __attribute__((destructor)) __unreg_module(void) \
{ \
ast_module_unregister(&__mod_info); \
} \
NULL, \
load_func, \
reload_func, \
unload_func, \
NULL, \
NULL, \
AST_MODULE, \
desc, \
keystr, \
flags_to_set, \
AST_BUILDOPT_SUM, \
load_pri, \
NULL, \
support_level, \
}; \
static void __attribute__((constructor)) __reg_module(void) \
{ \
ast_module_register(&__mod_info); \
} \
static void __attribute__((destructor)) __unreg_module(void) \
{ \
ast_module_unregister(&__mod_info); \
} \
static const __attribute__((unused)) struct ast_module_info *ast_module_info = &__mod_info
#define AST_MODULE_INFO_STANDARD(keystr, desc) \
AST_MODULE_INFO(keystr, AST_MODFLAG_LOAD_ORDER, desc, \
load_module, \
unload_module, \
NULL, \
AST_MODPRI_DEFAULT \
#define AST_MODULE_INFO_STANDARD(keystr, desc) \
AST_MODULE_INFO(keystr, AST_MODFLAG_LOAD_ORDER, desc, \
load_module, \
unload_module, \
NULL, \
AST_MODPRI_DEFAULT, \
AST_MODULE_SUPPORT_CORE \
)
#define AST_MODULE_INFO_STANDARD_EXTENDED(keystr, desc) \
AST_MODULE_INFO(keystr, AST_MODFLAG_LOAD_ORDER, desc, \
load_module, \
unload_module, \
NULL, \
AST_MODPRI_DEFAULT, \
AST_MODULE_SUPPORT_EXTENDED \
)
#define AST_MODULE_INFO_STANDARD_DEPRECATED(keystr, desc) \
AST_MODULE_INFO(keystr, AST_MODFLAG_LOAD_ORDER, desc, \
load_module, \
unload_module, \
NULL, \
AST_MODPRI_DEFAULT, \
AST_MODULE_SUPPORT_DEPRECATED \
)
#else /* plain C */
/* forward declare this pointer in modules, so that macro/function
@@ -401,12 +433,30 @@ static void __restore_globals(void)
} \
static const struct ast_module_info *ast_module_info = &__mod_info
#define AST_MODULE_INFO_STANDARD(keystr, desc) \
AST_MODULE_INFO(keystr, AST_MODFLAG_LOAD_ORDER, desc, \
.load = load_module, \
.unload = unload_module, \
.load_pri = AST_MODPRI_DEFAULT, \
#define AST_MODULE_INFO_STANDARD(keystr, desc) \
AST_MODULE_INFO(keystr, AST_MODFLAG_LOAD_ORDER, desc, \
.load = load_module, \
.unload = unload_module, \
.load_pri = AST_MODPRI_DEFAULT, \
.support_level = AST_MODULE_SUPPORT_CORE, \
)
#define AST_MODULE_INFO_STANDARD_EXTENDED(keystr, desc) \
AST_MODULE_INFO(keystr, AST_MODFLAG_LOAD_ORDER, desc, \
.load = load_module, \
.unload = unload_module, \
.load_pri = AST_MODPRI_DEFAULT, \
.support_level = AST_MODULE_SUPPORT_EXTENDED, \
)
#define AST_MODULE_INFO_STANDARD_DEPRECATED(keystr, desc) \
AST_MODULE_INFO(keystr, AST_MODFLAG_LOAD_ORDER, desc, \
.load = load_module, \
.unload = unload_module, \
.load_pri = AST_MODPRI_DEFAULT, \
.support_level = AST_MODULE_SUPPORT_DEPRECATED, \
)
#endif /* plain C */
/*!
@@ -478,6 +528,8 @@ int ast_register_application2(const char *app, int (*execute)(struct ast_channel
*/
int ast_unregister_application(const char *app);
const char *ast_module_support_level_to_string(enum ast_module_support_level support_level);
/*! Macro to safely ref and unref the self module for the current scope */
#define SCOPED_MODULE_USE(module) \
RAII_VAR(struct ast_module *, __self__ ## __LINE__, ast_module_ref(module), ast_module_unref)