summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid M. Lee <dlee@digium.com>2013-08-30 20:58:59 +0000
committerDavid M. Lee <dlee@digium.com>2013-08-30 20:58:59 +0000
commit2d1d5a98d587f30311e254c7de623434dff07dd1 (patch)
treecc4f15e91dc7ccd3df726f7f6af98355c76347a5
parentbe219c9ec9bcb1e54b8eed5ffaf7bced2f34abc4 (diff)
Fix graceful shutdown crash.
The cleanup code for optional_api needs to happen after all of the optional API users and providers have unused/unprovided. Unfortunately, regsitering the atexit() handler at the beginning of main() isn't soon enough, since module destructors run after that. ........ Merged revisions 398149 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@398150 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--include/asterisk/optional_api.h8
-rw-r--r--main/asterisk.c5
-rw-r--r--main/optional_api.c20
3 files changed, 6 insertions, 27 deletions
diff --git a/include/asterisk/optional_api.h b/include/asterisk/optional_api.h
index 7d66d2e47..394aed0e4 100644
--- a/include/asterisk/optional_api.h
+++ b/include/asterisk/optional_api.h
@@ -176,14 +176,6 @@ void ast_optional_api_use(const char *symname, ast_optional_fn *optional_ref,
void ast_optional_api_unuse(const char *symname, ast_optional_fn *optional_ref,
const char *module);
-/*!
- * \brief Call at exit to clean up optional_api internals.
- *
- * Since the optional_api code might run before main() starts, it can't safely
- * register its own cleanup handlers. That has to be done within main().
- */
-void optional_api_cleanup(void);
-
#define AST_OPTIONAL_API_NAME(name) __##name
#if defined(AST_API_MODULE)
diff --git a/main/asterisk.c b/main/asterisk.c
index 395d0cc18..3b08d76c5 100644
--- a/main/asterisk.c
+++ b/main/asterisk.c
@@ -247,7 +247,6 @@ int daemon(int, int); /* defined in libresolv of all places */
#include "asterisk/stasis_endpoints.h"
#include "asterisk/stasis_system.h"
#include "asterisk/security_events.h"
-#include "asterisk/optional_api.h"
#include "../defaults.h"
@@ -4169,10 +4168,6 @@ int main(int argc, char *argv[])
ast_el_read_history(filename);
}
-#if defined(OPTIONAL_API)
- ast_register_cleanup(optional_api_cleanup);
-#endif
-
ast_json_init();
ast_ulaw_init();
ast_alaw_init();
diff --git a/main/optional_api.c b/main/optional_api.c
index f48fe11a1..9c96fa646 100644
--- a/main/optional_api.c
+++ b/main/optional_api.c
@@ -158,18 +158,8 @@ struct {
size_t len;
} apis;
-void optional_api_cleanup(void)
-{
- while (apis.len--) {
- optional_api_destroy(apis.list[apis.len]);
- }
- free(apis.list);
- apis.list = NULL;
- apis.maxlen = 0;
-}
-
/*!
- * \brief Gets (or creates) the \ref optional_api for the give function.
+ * \brief Gets (or creates) the \ref optional_api for the given function.
*
* \param sysname Name of the function to look up.
* \return Corresponding \ref optional_api.
@@ -181,9 +171,11 @@ static struct optional_api *get_api(const char *symname)
size_t i;
/* Find one, if we already have it */
- for (i = 0; i < apis.len; ++i) {
- if (strcmp(symname, apis.list[i]->symname) == 0) {
- return apis.list[i];
+ if (apis.list) {
+ for (i = 0; i < apis.len; ++i) {
+ if (strcmp(symname, apis.list[i]->symname) == 0) {
+ return apis.list[i];
+ }
}
}