[asterisk-commits] rmudgett: branch 1.8 r377135 - in /branches/1.8: include/asterisk/ main/ main...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Mon Dec 3 14:26:41 CST 2012


Author: rmudgett
Date: Mon Dec  3 14:26:37 2012
New Revision: 377135

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=377135
Log:
Cleanup core main on exit.

* Cleanup time zones on exit.

* Make exit clean/unclean report consistent for AMI and CLI in
really_quit().

(issue ASTERISK-20649)
Reported by: Corey Farrell
Patches:
      core-cleanup-1_8-10.patch (license #5909) patch uploaded by Corey Farrell
      core-cleanup-11-trunk.patch (license #5909) patch uploaded by Corey Farrell
      Modified

Modified:
    branches/1.8/include/asterisk/_private.h
    branches/1.8/main/asterisk.c
    branches/1.8/main/stdtime/localtime.c

Modified: branches/1.8/include/asterisk/_private.h
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/include/asterisk/_private.h?view=diff&rev=377135&r1=377134&r2=377135
==============================================================================
--- branches/1.8/include/asterisk/_private.h (original)
+++ branches/1.8/include/asterisk/_private.h Mon Dec  3 14:26:37 2012
@@ -19,6 +19,7 @@
 int load_pbx(void);			/*!< Provided by pbx.c */
 int init_logger(void);			/*!< Provided by logger.c */
 void close_logger(void);		/*!< Provided by logger.c */
+void clean_time_zones(void);			/*!< Provided by localtime.c */
 int init_framer(void);			/*!< Provided by frame.c */
 int ast_term_init(void);		/*!< Provided by term.c */
 int astdb_init(void);			/*!< Provided by db.c */

Modified: branches/1.8/main/asterisk.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/main/asterisk.c?view=diff&rev=377135&r1=377134&r2=377135
==============================================================================
--- branches/1.8/main/asterisk.c (original)
+++ branches/1.8/main/asterisk.c Mon Dec  3 14:26:37 2012
@@ -1740,6 +1740,8 @@
 
 static void really_quit(int num, shutdown_nice_t niceness, int restart)
 {
+	int active_channels;
+
 	if (niceness >= SHUTDOWN_NICE) {
 		ast_module_shutdown();
 	}
@@ -1766,21 +1768,23 @@
 			}
 		}
 	}
+	active_channels = ast_active_channels();
 	/* The manager event for shutdown must happen prior to ast_run_atexits, as
 	 * the manager interface will dispose of its sessions as part of its
 	 * shutdown.
 	 */
 	manager_event(EVENT_FLAG_SYSTEM, "Shutdown", "Shutdown: %s\r\n"
 			"Restart: %s\r\n",
-			ast_active_channels() ? "Uncleanly" : "Cleanly",
+			active_channels ? "Uncleanly" : "Cleanly",
 			restart ? "True" : "False");
 
 	if (option_verbose)
 		ast_verbose("Executing last minute cleanups\n");
 	ast_run_atexits();
 	/* Called on exit */
-	if (option_verbose && ast_opt_console)
-		ast_verbose("Asterisk %s ending (%d).\n", ast_active_channels() ? "uncleanly" : "cleanly", num);
+	if (option_verbose && ast_opt_console) {
+		ast_verbose("Asterisk %s ending (%d).\n", active_channels ? "uncleanly" : "cleanly", num);
+	}
 	ast_debug(1, "Asterisk ending (%d).\n", num);
 	if (ast_socket > -1) {
 		pthread_cancel(lthread);
@@ -1807,6 +1811,7 @@
 
 		/* close logger */
 		close_logger();
+		clean_time_zones();
 
 		/* If there is a consolethread running send it a SIGHUP 
 		   so it can execvp, otherwise we can do it ourselves */
@@ -1820,6 +1825,7 @@
 	} else {
 		/* close logger */
 		close_logger();
+		clean_time_zones();
 	}
 
 	exit(0);
@@ -2218,14 +2224,25 @@
 
 #define ASTERISK_PROMPT2 "%s*CLI> "
 
-static struct ast_cli_entry cli_asterisk[] = {
-	AST_CLI_DEFINE(handle_abort_shutdown, "Cancel a running shutdown"),
+/*!
+ * \brief Shutdown Asterisk CLI commands.
+ *
+ * \note These CLI commands cannot be unregistered at shutdown
+ * because one of them is likely the reason for the shutdown.
+ * The CLI generates a warning if a command is in-use when it is
+ * unregistered.
+ */
+static struct ast_cli_entry cli_asterisk_shutdown[] = {
 	AST_CLI_DEFINE(handle_stop_now, "Shut down Asterisk immediately"),
 	AST_CLI_DEFINE(handle_stop_gracefully, "Gracefully shut down Asterisk"),
 	AST_CLI_DEFINE(handle_stop_when_convenient, "Shut down Asterisk at empty call volume"),
 	AST_CLI_DEFINE(handle_restart_now, "Restart Asterisk immediately"), 
 	AST_CLI_DEFINE(handle_restart_gracefully, "Restart Asterisk gracefully"),
 	AST_CLI_DEFINE(handle_restart_when_convenient, "Restart Asterisk at empty call volume"),
+};
+
+static struct ast_cli_entry cli_asterisk[] = {
+	AST_CLI_DEFINE(handle_abort_shutdown, "Cancel a running shutdown"),
 	AST_CLI_DEFINE(show_warranty, "Show the warranty (if any) for this copy of Asterisk"),
 	AST_CLI_DEFINE(show_license, "Show the license(s) for this copy of Asterisk"),
 	AST_CLI_DEFINE(handle_version, "Display version info"),
@@ -3324,6 +3341,11 @@
 	}
 }
 
+static void main_atexit(void)
+{
+	ast_cli_unregister_multiple(cli_asterisk, ARRAY_LEN(cli_asterisk));
+}
+
 int main(int argc, char *argv[])
 {
 	int c;
@@ -4025,7 +4047,9 @@
 #endif	/* defined(__AST_DEBUG_MALLOC) */
 
 	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);
 
 	run_startup_commands();
 

Modified: branches/1.8/main/stdtime/localtime.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/main/stdtime/localtime.c?view=diff&rev=377135&r1=377134&r2=377135
==============================================================================
--- branches/1.8/main/stdtime/localtime.c (original)
+++ branches/1.8/main/stdtime/localtime.c Mon Dec  3 14:26:37 2012
@@ -71,6 +71,7 @@
 #include "private.h"
 #include "tzfile.h"
 
+#include "asterisk/_private.h"
 #include "asterisk/lock.h"
 #include "asterisk/localtime.h"
 #include "asterisk/strings.h"
@@ -427,7 +428,7 @@
 			closedir(sp->dir);
 		}
 #endif
-		free(sp);
+		ast_free(sp);
 
 		/* Just in case the signal was sent late */
 		AST_LIST_LOCK(&zonelist);
@@ -1417,6 +1418,17 @@
 		return -1;
 }
 
+void clean_time_zones(void)
+{
+	struct state *sp;
+
+	AST_LIST_LOCK(&zonelist);
+	while ((sp = AST_LIST_REMOVE_HEAD(&zonelist, list))) {
+		ast_free(sp);
+	}
+	AST_LIST_UNLOCK(&zonelist);
+}
+
 static const struct state *ast_tzset(const char *zone)
 {
 	struct state *sp;




More information about the asterisk-commits mailing list