aboutsummaryrefslogtreecommitdiffstats
path: root/include/asterisk/module.h
diff options
context:
space:
mode:
authorrizzo <rizzo@f38db490-d61c-443f-a65b-d21fe96a405b>2006-04-06 09:10:31 +0000
committerrizzo <rizzo@f38db490-d61c-443f-a65b-d21fe96a405b>2006-04-06 09:10:31 +0000
commite74b126e91e7bf13630d1ca21f99237f7a346716 (patch)
treed05b6273543906f19e3cf3e069189c4888bb42e8 /include/asterisk/module.h
parent4decf040938286b0efc6802a44b22304981ef9f9 (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/asterisk/module.h')
-rw-r--r--include/asterisk/module.h39
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)
}