[asterisk-commits] coreyfarrell: branch 11 r411310 - in /branches/11: include/ main/
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Thu Mar 27 13:18:32 CDT 2014
Author: coreyfarrell
Date: Thu Mar 27 13:18:23 2014
New Revision: 411310
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=411310
Log:
main/formats: Fix crash in ast_format_cmp during non-clean shutdown.
* Backport ast_register_cleanup from Asterisk 12.
* Use ast_register_cleanup for format_attr_shutdown.
ast_register_cleanup was originally commited in r390122 by dlee.
(closes issue ASTERISK-23103)
Reported by: JoshE
Modified:
branches/11/include/asterisk.h
branches/11/main/asterisk.c
branches/11/main/format.c
Modified: branches/11/include/asterisk.h
URL: http://svnview.digium.com/svn/asterisk/branches/11/include/asterisk.h?view=diff&rev=411310&r1=411309&r2=411310
==============================================================================
--- branches/11/include/asterisk.h (original)
+++ branches/11/include/asterisk.h Thu Mar 27 13:18:23 2014
@@ -90,6 +90,22 @@
int ast_register_atexit(void (*func)(void));
/*!
+ * \since 11.9
+ * \brief Register a function to be executed before Asterisk gracefully exits.
+ *
+ * If Asterisk is immediately shutdown (core stop now, or sending the TERM
+ * signal), the callback is not run. When the callbacks are run, they are run in
+ * sequence with ast_register_atexit() callbacks, in the reverse order of
+ * registration.
+ *
+ * \param func The callback function to use.
+ *
+ * \retval 0 on success.
+ * \retval -1 on error.
+ */
+int ast_register_cleanup(void (*func)(void));
+
+/*!
* \brief Unregister a function registered with ast_register_atexit().
* \param func The callback function to unregister.
*/
Modified: branches/11/main/asterisk.c
URL: http://svnview.digium.com/svn/asterisk/branches/11/main/asterisk.c?view=diff&rev=411310&r1=411309&r2=411310
==============================================================================
--- branches/11/main/asterisk.c (original)
+++ branches/11/main/asterisk.c Thu Mar 27 13:18:23 2014
@@ -228,6 +228,7 @@
struct ast_atexit {
void (*func)(void);
+ int is_cleanup;
AST_LIST_ENTRY(ast_atexit) list;
};
@@ -970,13 +971,13 @@
#endif /* ! LOW_MEMORY */
-static void ast_run_atexits(void)
+static void ast_run_atexits(int run_cleanups)
{
struct ast_atexit *ae;
AST_LIST_LOCK(&atexits);
while ((ae = AST_LIST_REMOVE_HEAD(&atexits, list))) {
- if (ae->func) {
+ if (ae->func && (!ae->is_cleanup || run_cleanups)) {
ae->func();
}
ast_free(ae);
@@ -998,7 +999,7 @@
AST_LIST_TRAVERSE_SAFE_END;
}
-int ast_register_atexit(void (*func)(void))
+static int register_atexit(void (*func)(void), int is_cleanup)
{
struct ast_atexit *ae;
@@ -1007,6 +1008,7 @@
return -1;
}
ae->func = func;
+ ae->is_cleanup = is_cleanup;
AST_LIST_LOCK(&atexits);
__ast_unregister_atexit(func);
@@ -1014,6 +1016,16 @@
AST_LIST_UNLOCK(&atexits);
return 0;
+}
+
+int ast_register_atexit(void (*func)(void))
+{
+ return register_atexit(func, 0);
+}
+
+int ast_register_cleanup(void (*func)(void))
+{
+ return register_atexit(func, 1);
}
void ast_unregister_atexit(void (*func)(void))
@@ -1802,8 +1814,9 @@
static void really_quit(int num, shutdown_nice_t niceness, int restart)
{
int active_channels;
-
- if (niceness >= SHUTDOWN_NICE) {
+ int run_cleanups = niceness >= SHUTDOWN_NICE;
+
+ if (run_cleanups) {
ast_module_shutdown();
}
@@ -1861,7 +1874,7 @@
active_channels ? "uncleanly" : "cleanly", num);
ast_verb(0, "Executing last minute cleanups\n");
- ast_run_atexits();
+ ast_run_atexits(run_cleanups);
ast_debug(1, "Asterisk ending (%d).\n", num);
if (ast_socket > -1) {
Modified: branches/11/main/format.c
URL: http://svnview.digium.com/svn/asterisk/branches/11/main/format.c?view=diff&rev=411310&r1=411309&r2=411310
==============================================================================
--- branches/11/main/format.c (original)
+++ branches/11/main/format.c Thu Mar 27 13:18:23 2014
@@ -1128,7 +1128,7 @@
}
ast_cli_register_multiple(my_clis, ARRAY_LEN(my_clis));
- ast_register_atexit(format_attr_shutdown);
+ ast_register_cleanup(format_attr_shutdown);
return 0;
}
More information about the asterisk-commits
mailing list