diff options
author | rizzo <rizzo@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-04-06 09:10:31 +0000 |
---|---|---|
committer | rizzo <rizzo@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-04-06 09:10:31 +0000 |
commit | e74b126e91e7bf13630d1ca21f99237f7a346716 (patch) | |
tree | d05b6273543906f19e3cf3e069189c4888bb42e8 /include | |
parent | 4decf040938286b0efc6802a44b22304981ef9f9 (diff) |
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: http://svn.digium.com/svn/asterisk/trunk@17790 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'include')
-rw-r--r-- | include/asterisk/module.h | 39 |
1 files changed, 27 insertions, 12 deletions
diff --git a/include/asterisk/module.h b/include/asterisk/module.h index b00ec488d..5e1b6e094 100644 --- a/include/asterisk/module.h +++ b/include/asterisk/module.h @@ -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) } |