summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorLuigi Rizzo <rizzo@icir.org>2008-01-02 08:53:16 +0000
committerLuigi Rizzo <rizzo@icir.org>2008-01-02 08:53:16 +0000
commitca2a8e3fe1082fbf193f0f31a4ba08b01ec7cfe0 (patch)
tree337a11dc4d135c75bcc1e8d6b95d0401cdcc94a4 /include
parent04db372bf38308c3334619cf2efd50709ba60b31 (diff)
There are three instances of the module definition macros,
which make maintaining this file very error prone. This commit merges the embedded and !embedded versions, and fixes the C++ version. Eventually we should move to a single version of the macro. Too bad C++ doesn't like the C-style struct initializers .foo = some_value git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@95771 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'include')
-rw-r--r--include/asterisk/module.h57
1 files changed, 24 insertions, 33 deletions
diff --git a/include/asterisk/module.h b/include/asterisk/module.h
index ac0fe5dd4..2344fe825 100644
--- a/include/asterisk/module.h
+++ b/include/asterisk/module.h
@@ -1,7 +1,7 @@
/*
* Asterisk -- An open source telephony toolkit.
*
- * Copyright (C) 1999 - 2006, Digium, Inc.
+ * Copyright (C) 1999 - 2008, Digium, Inc.
*
* Mark Spencer <markster@digium.com>
* Kevin P. Fleming <kpfleming@digium.com>
@@ -184,7 +184,6 @@ struct ast_module_user_list;
/*! \page ModMngmnt The Asterisk Module management interface
*
* All modules must implement the module API (load, unload...)
- * whose functions are exported through fields of a "struct module_symbol";
*/
enum ast_module_flags {
@@ -244,6 +243,8 @@ void ast_module_unref(struct ast_module *);
reload_func, \
unload_func, \
AST_MODULE, \
+ NULL, \
+ NULL, \
desc, \
keystr, \
flags_to_set, \
@@ -265,13 +266,26 @@ void ast_module_unref(struct ast_module *);
unload_module, \
NULL \
)
-#else
+#else /* plain C */
+
/* forward declare this pointer in modules, so that macro/function
calls that need it can get it, since it will actually be declared
and populated at the end of the module's source file... */
const static __attribute__((unused)) struct ast_module_info *ast_module_info;
-#if defined(EMBEDDED_MODULE)
+#if !defined(EMBEDDED_MODULE)
+#define __MODULE_INFO_SECTION
+#define __MODULE_INFO_GLOBALS
+#else
+/*
+ * For embedded modules we need additional information to backup and
+ * restore the global variables in the module itself, so we can unload
+ * reload the module.
+ * EMBEDDED_MODULE is defined as the module name, so the calls to make_var()
+ * below will actually define different symbols for each module.
+ */
+#define __MODULE_INFO_SECTION __attribute__((section(".embed_module")))
+#define __MODULE_INFO_GLOBALS .backup_globals = __backup_globals, .restore_globals = __restore_globals,
#define make_var_sub(mod, type) __ ## mod ## _ ## type
#define make_var(mod, type) make_var_sub(mod, type)
@@ -314,36 +328,15 @@ static void __restore_globals(void)
memcpy(& make_var(EMBEDDED_MODULE, data_start), __global_backup, data_size);
}
-
-#define AST_MODULE_INFO(keystr, flags_to_set, desc, fields...) \
- static struct ast_module_info \
- __attribute__((section(".embed_module"))) \
- __mod_info = { \
- .backup_globals = __backup_globals, \
- .restore_globals = __restore_globals, \
- .name = AST_MODULE, \
- .flags = flags_to_set, \
- .description = desc, \
- .key = keystr, \
- fields \
- }; \
- static void __attribute__ ((constructor)) __reg_module(void) \
- { \
- ast_module_register(&__mod_info); \
- } \
- static void __attribute__ ((destructor)) __unreg_module(void) \
- { \
- ast_module_unregister(&__mod_info); \
- } \
- const static struct ast_module_info *ast_module_info = &__mod_info
-
#undef make_var
#undef make_var_sub
-
-#else /* !defined(EMBEDDED_MODULE) */
+#endif /* EMBEDDED_MODULE */
#define AST_MODULE_INFO(keystr, flags_to_set, desc, fields...) \
- static struct ast_module_info __mod_info = { \
+ static struct ast_module_info \
+ __MODULE_INFO_SECTION \
+ __mod_info = { \
+ __MODULE_INFO_GLOBALS \
.name = AST_MODULE, \
.flags = flags_to_set, \
.description = desc, \
@@ -361,14 +354,12 @@ static void __restore_globals(void)
} \
const static struct ast_module_info *ast_module_info = &__mod_info
-#endif /* !defined(EMBEDDED_MODULE) */
-
#define AST_MODULE_INFO_STANDARD(keystr, desc) \
AST_MODULE_INFO(keystr, AST_MODFLAG_DEFAULT, desc, \
.load = load_module, \
.unload = unload_module, \
)
-#endif
+#endif /* plain C */
/*!
* \brief Register an application.