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:
parent
be219c9ec9
commit
2d1d5a98d5
|
@ -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)
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue