mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-23 22:45:39 +00:00
small cleanups to module.h and loader.c to start playing with
new-style modules using static symbols. Everything will still work as before, but new-style modules can now be defined by putting a '#define STATIC_MODULE' somewhere before including module.h, then declaring STATIC_MODULE the various methods (load, unload, key...) that the module is supposed to supply, and adding a 'STD_MOD(MOD_1, reload_fn, NULL, NULL)' macro call at the end. A module compiled in this way will be loaded RTLD_NOW|RTLD_LOCAL so symbol pollution is reduced, and symbols are resolved immediately. Removing just the '#define STATIC_MODULE' will restore the old behaviour. In order for a module to be loaded RTLD_NOW|RTLD_LOCAL, it must not export any symbol[1], and all the modules it depends on (e.g. res_*) must be loaded already. [1] Mechanisms are in place, and will be enabled later, to still allow such modules to 'export' symbols and resolving the dependencies irrespective of the load order. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@17790 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -34,12 +34,12 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef STATIC_MODULE
|
||||
#define STATIC_MODULE /* empty - symbols are global */
|
||||
#else
|
||||
#ifdef STATIC_MODULE /* symbols are static */
|
||||
#define _HAVE_STATIC_MODULE
|
||||
#undef STATIC_MODULE
|
||||
#define STATIC_MODULE static /* symbols are static */
|
||||
#endif
|
||||
#else /* !STATIC_MODULE, symbols are global */
|
||||
#define STATIC_MODULE /* empty - symbols are global */
|
||||
|
||||
/*! \note Every module should provide these functions */
|
||||
/*!
|
||||
@@ -53,7 +53,7 @@ extern "C" {
|
||||
* If the module is not loaded successfully, Asterisk will call its
|
||||
* unload_module() function.
|
||||
*/
|
||||
STATIC_MODULE int load_module(void);
|
||||
int load_module(void);
|
||||
|
||||
/*!
|
||||
* \brief Cleanup all module structures, sockets, etc.
|
||||
@@ -64,7 +64,7 @@ STATIC_MODULE int load_module(void);
|
||||
*
|
||||
* \return Zero on success, or non-zero on error.
|
||||
*/
|
||||
STATIC_MODULE int unload_module(void);
|
||||
int unload_module(void);
|
||||
|
||||
/*!
|
||||
* \brief Provides a usecount.
|
||||
@@ -76,13 +76,13 @@ STATIC_MODULE int unload_module(void);
|
||||
*
|
||||
* \return The module's usecount.
|
||||
*/
|
||||
STATIC_MODULE int usecount(void); /* How many channels provided by this module are in use? */
|
||||
int usecount(void); /* How many channels provided by this module are in use? */
|
||||
|
||||
/*! \brief Provides a description of the module.
|
||||
*
|
||||
* \return a short description of your module
|
||||
*/
|
||||
STATIC_MODULE char *description(void); /* Description of this module */
|
||||
char *description(void); /* Description of this module */
|
||||
|
||||
/*!
|
||||
* \brief Returns the ASTERISK_GPL_KEY
|
||||
@@ -99,7 +99,7 @@ STATIC_MODULE char *description(void); /* Description of this module */
|
||||
*
|
||||
* \return ASTERISK_GPL_KEY
|
||||
*/
|
||||
STATIC_MODULE char *key(void); /* Return the below mentioned key, unmodified */
|
||||
char *key(void); /* Return the below mentioned key, unmodified */
|
||||
|
||||
/*!
|
||||
* \brief Reload stuff.
|
||||
@@ -109,7 +109,8 @@ STATIC_MODULE char *key(void); /* Return the below mentioned key, unmodified */
|
||||
*
|
||||
* \return The return value is not used.
|
||||
*/
|
||||
STATIC_MODULE int reload(void); /* reload configs */
|
||||
int reload(void); /* reload configs */
|
||||
#endif /* !STATIC_MODULE case */
|
||||
|
||||
/*! \brief The text the key() function should return. */
|
||||
#define ASTERISK_GPL_KEY \
|
||||
@@ -506,6 +507,15 @@ struct symbol_entry {
|
||||
#define MOD_FIELD(f) . ## f = f
|
||||
#define METHOD_BASE(_base, _name) . ## _name = _base ## _name
|
||||
|
||||
/*
|
||||
* Each 'registerable' entity has a pointer in the
|
||||
* struct ast_registry, which points to an array of objects of
|
||||
* the same type. The ast_*_register() function will be able to
|
||||
* derive the size of these entries.
|
||||
*/
|
||||
struct ast_registry {
|
||||
struct ast_cli_entry *clis;
|
||||
};
|
||||
|
||||
struct module_symbols {
|
||||
int (*load_module)(void);
|
||||
@@ -520,22 +530,27 @@ struct module_symbols {
|
||||
MOD_1, /* old style, but symbols here */
|
||||
MOD_2, /* new style, exported symbols */
|
||||
} type;
|
||||
struct ast_registry *reg;
|
||||
struct symbol_entry *exported_symbols;
|
||||
struct symbol_entry *required_symbols;
|
||||
};
|
||||
|
||||
#define STD_MOD(t, exp, req) \
|
||||
#ifndef _HAVE_STATIC_MODULE
|
||||
#define STD_MOD(t, reload_fn, exp, req)
|
||||
#else
|
||||
#define STD_MOD(t, reload_fn, exp, req) \
|
||||
struct module_symbols mod_data = { \
|
||||
.load_module = load_module, \
|
||||
.unload_module = unload_module, \
|
||||
.description = description, \
|
||||
.key = key, \
|
||||
.reload = reload, \
|
||||
.reload = reload_fn, \
|
||||
.usecount = usecount, \
|
||||
.type = t, \
|
||||
.exported_symbols = exp, \
|
||||
.required_symbols = req \
|
||||
};
|
||||
#endif /* _HAVE_STATIC_MODULE */
|
||||
|
||||
#if defined(__cplusplus) || defined(c_plusplus)
|
||||
}
|
||||
|
Reference in New Issue
Block a user