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
This commit is contained in:
David M. Lee 2013-08-30 20:58:59 +00:00
parent be219c9ec9
commit 2d1d5a98d5
3 changed files with 6 additions and 27 deletions

View File

@ -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)

View File

@ -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();

View File

@ -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];
}
}
}