Since 'core stop now' and 'core restart now' do not stop modules,
it is unsafe for most of the core to run cleanups. Originally all
cleanups used ast_register_atexit, and were only changed when it
was shown to be unsafe. ast_register_atexit is now used only when
absolutely required to prevent corruption and close child processes.
Exceptions that need to use ast_register_atexit:
* CDR: Flush records.
* res_musiconhold: Kill external applications.
* AstDB: Close the DB.
* canary_exit: Kill canary process.
ASTERISK-24142 #close
Reported by: David Brillert
ASTERISK-24683 #close
Reported by: Peter Katzmann
ASTERISK-24805 #close
Reported by: Badalian Vyacheslav
ASTERISK-24881 #close
Reported by: Corey Farrell
Review: https://reviewboard.asterisk.org/r/4500/
Review: https://reviewboard.asterisk.org/r/4501/
git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@433495
65c4cc65-6c06-0410-ace0-
fbb531ad65f3
*
* \retval 0 on success.
* \retval -1 on error.
+ *
+ * \note This function should be rarely used in situations where
+ * something must be shutdown to avoid corruption, excessive data
+ * loss, or when external programs must be stopped. All other
+ * cleanup in the core should use ast_register_cleanup.
*/
int ast_register_atexit(void (*func)(void));
}
int ast_aoc_cli_init(void)
{
- ast_register_atexit(aoc_shutdown);
+ ast_register_cleanup(aoc_shutdown);
return ast_cli_register_multiple(aoc_cli, ARRAY_LEN(aoc_cli));
}
ast_lastreloadtime = ast_startuptime = ast_tvnow();
ast_cli_register_multiple(cli_asterisk_shutdown, ARRAY_LEN(cli_asterisk_shutdown));
ast_cli_register_multiple(cli_asterisk, ARRAY_LEN(cli_asterisk));
- ast_register_atexit(main_atexit);
+ ast_register_cleanup(main_atexit);
run_startup_commands();
int ast_fd_init(void)
{
- ast_register_atexit(fd_shutdown);
+ ast_register_cleanup(fd_shutdown);
return ast_cli_register(&cli_show_fd);
}
ast_log(LOG_ERROR, "Could not open malloc debug log file: %s\n", filename);
}
- ast_register_atexit(mm_atexit_ast);
+ ast_register_cleanup(mm_atexit_ast);
}
#endif /* defined(__AST_DEBUG_MALLOC) */
ast_cli_register_multiple(cli_astobj2, ARRAY_LEN(cli_astobj2));
#endif
- ast_register_atexit(astobj2_cleanup);
+ ast_register_cleanup(astobj2_cleanup);
return 0;
}
initialize_cc_devstate_map();
res |= ast_devstate_prov_add("ccss", ccss_device_state);
- ast_register_atexit(cc_shutdown);
+ ast_register_cleanup(cc_shutdown);
return res;
}
return -1;
}
- ast_register_atexit(ast_cel_engine_term);
+ ast_register_cleanup(ast_cel_engine_term);
return 0;
}
ast_plc_reload();
- ast_register_atexit(channels_shutdown);
+ ast_register_cleanup(channels_shutdown);
}
/*! \brief Print call group and pickup group ---*/
void ast_builtins_init(void)
{
ast_cli_register_multiple(cli_cli, ARRAY_LEN(cli_cli));
- ast_register_atexit(cli_shutdown);
+ ast_register_cleanup(cli_shutdown);
}
/*!
int register_config_cli(void)
{
ast_cli_register_multiple(cli_config, ARRAY_LEN(cli_config));
- ast_register_atexit(config_shutdown);
+ ast_register_cleanup(config_shutdown);
return 0;
}
AST_TEST_REGISTER(test_data_get);
- ast_register_atexit(data_shutdown);
+ ast_register_cleanup(data_shutdown);
return res;
}
ast_cli_register(&cli_status);
ast_cli_register(&cli_refresh);
- ast_register_atexit(dnsmgr_shutdown);
+ ast_register_cleanup(dnsmgr_shutdown);
return do_reload(1);
}
ast_cli_register_multiple(event_cli, ARRAY_LEN(event_cli));
- ast_register_atexit(event_shutdown);
+ ast_register_cleanup(event_shutdown);
return 0;
res |= AST_TEST_REGISTER(features_test);
#endif /* defined(TEST_FRAMEWORK) */
- ast_register_atexit(features_shutdown);
+ ast_register_cleanup(features_shutdown);
return res;
}
int ast_file_init(void)
{
ast_cli_register_multiple(cli_file, ARRAY_LEN(cli_file));
- ast_register_atexit(file_shutdown);
+ ast_register_cleanup(file_shutdown);
return 0;
}
goto init_list_cleanup;
}
- ast_register_atexit(format_list_shutdown);
+ ast_register_cleanup(format_list_shutdown);
return 0;
init_list_cleanup:
ast_http_uri_link(&statusuri);
ast_http_uri_link(&staticuri);
ast_cli_register_multiple(cli_http, ARRAY_LEN(cli_http));
- ast_register_atexit(http_shutdown);
+ ast_register_cleanup(http_shutdown);
return __ast_http_load(0);
}
int ast_image_init(void)
{
ast_cli_register_multiple(cli_image, ARRAY_LEN(cli_image));
- ast_register_atexit(image_shutdown);
+ ast_register_cleanup(image_shutdown);
return 0;
}
ast_cli_register_multiple(cli_indications, ARRAY_LEN(cli_indications));
- ast_register_atexit(indications_shutdown);
+ ast_register_cleanup(indications_shutdown);
return 0;
}
struct ao2_container *temp_event_docs;
#endif
- ast_register_atexit(manager_shutdown);
+ ast_register_cleanup(manager_shutdown);
/* Register default actions */
ast_manager_register_xml_core("Ping", 0, action_ping);
res |= ast_register_application2(app_msg_send, msg_send_exec, NULL, NULL, NULL);
res |= ast_manager_register_xml_core("MessageSend", EVENT_FLAG_MESSAGE, action_messagesend);
- ast_register_atexit(message_shutdown);
+ ast_register_cleanup(message_shutdown);
return res;
}
{
ast_cli_register_multiple(cli_named_acl, ARRAY_LEN(cli_named_acl));
- ast_register_atexit(named_acl_cleanup);
+ ast_register_cleanup(named_acl_cleanup);
if (aco_info_init(&cfg_info)) {
return 0;
{
int x;
- ast_register_atexit(unload_pbx);
+ ast_register_cleanup(unload_pbx);
/* Initialize the PBX */
ast_verb(1, "Asterisk PBX Core Initializing\n");
hintdevices = ao2_container_alloc(HASH_EXTENHINT_SIZE, hintdevice_hash_cb, hintdevice_cmp_multiple);
statecbs = ao2_container_alloc(1, NULL, statecbs_cmp);
- ast_register_atexit(pbx_shutdown);
+ ast_register_cleanup(pbx_shutdown);
return (hints && hintdevices && statecbs) ? 0 : -1;
}
void ast_stun_init(void)
{
ast_cli_register_multiple(cli_stun, sizeof(cli_stun) / sizeof(struct ast_cli_entry));
- ast_register_atexit(stun_shutdown);
+ ast_register_cleanup(stun_shutdown);
}
ast_cli_register_multiple(taskprocessor_clis, ARRAY_LEN(taskprocessor_clis));
- ast_register_atexit(tps_shutdown);
+ ast_register_cleanup(tps_shutdown);
return 0;
}
#ifdef TEST_FRAMEWORK
/* Register cli commands */
ast_cli_register_multiple(test_cli, ARRAY_LEN(test_cli));
- ast_register_atexit(test_shutdown);
+ ast_register_cleanup(test_shutdown);
#endif
return 0;
{
pthread_mutex_init(&threadstoragelock, NULL);
ast_cli_register_multiple(cli, ARRAY_LEN(cli));
- ast_register_atexit(threadstorage_shutdown);
+ ast_register_cleanup(threadstorage_shutdown);
}
#endif /* !defined(DEBUG_THREADLOCALS) */
return -1;
}
- ast_register_atexit(timing_shutdown);
+ ast_register_cleanup(timing_shutdown);
return ast_cli_register_multiple(cli_timing, ARRAY_LEN(cli_timing));
}
ast_rwlock_init(&tablelock);
res = matrix_resize(1);
res |= ast_cli_register_multiple(cli_translate, ARRAY_LEN(cli_translate));
- ast_register_atexit(translate_shutdown);
+ ast_register_cleanup(translate_shutdown);
return res;
}
ast_cli_register_multiple(cli_udptl, ARRAY_LEN(cli_udptl));
- ast_register_atexit(udptl_shutdown);
+ ast_register_cleanup(udptl_shutdown);
}
ast_cli_register_multiple(utils_cli, ARRAY_LEN(utils_cli));
#endif
#endif
- ast_register_atexit(utils_shutdown);
+ ast_register_cleanup(utils_shutdown);
return 0;
}
ast_xml_init();
/* register function to be run when asterisk finish. */
- ast_register_atexit(xmldoc_unload_documentation);
+ ast_register_cleanup(xmldoc_unload_documentation);
globbuf.gl_offs = 0; /* slots to reserve in gl_pathv */