[svn-commits] coreyfarrell: branch 11 r411310 - in /branches/11: include/ main/

SVN commits to the Digium repositories svn-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 svn-commits mailing list