]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Cleanup core main on exit.
authorRichard Mudgett <rmudgett@digium.com>
Mon, 3 Dec 2012 20:33:08 +0000 (20:33 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Mon, 3 Dec 2012 20:33:08 +0000 (20:33 +0000)
* 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
........

Merged revisions 377135 from http://svn.asterisk.org/svn/asterisk/branches/1.8

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/10@377136 65c4cc65-6c06-0410-ace0-fbb531ad65f3

include/asterisk/_private.h
main/asterisk.c
main/stdtime/localtime.c

index e1f8c7246baea9f8748e4fcdf790791ce902865b..a7ed68136f3212ae6b155f88c1c3df611dc1cc05 100644 (file)
@@ -19,6 +19,7 @@ int load_modules(unsigned int);               /*!< Provided by loader.c */
 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 */
index 8caf8f6df3d6fe771072b81336d904a6266935aa..379e095511d134c7481b0681d910dab84c8d31f1 100644 (file)
@@ -1751,6 +1751,8 @@ static int can_safely_quit(shutdown_nice_t niceness, int restart)
 
 static void really_quit(int num, shutdown_nice_t niceness, int restart)
 {
+       int active_channels;
+
        if (niceness >= SHUTDOWN_NICE) {
                ast_module_shutdown();
        }
@@ -1777,21 +1779,23 @@ static void really_quit(int num, shutdown_nice_t niceness, int restart)
                        }
                }
        }
+       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);
@@ -1818,6 +1822,7 @@ static void really_quit(int num, shutdown_nice_t niceness, int restart)
 
                /* 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 */
@@ -1831,6 +1836,7 @@ static void really_quit(int num, shutdown_nice_t niceness, int restart)
        } else {
                /* close logger */
                close_logger();
+               clean_time_zones();
        }
 
        exit(0);
@@ -2229,14 +2235,25 @@ static char *show_license(struct ast_cli_entry *e, int cmd, struct ast_cli_args
 
 #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"),
@@ -3356,6 +3373,11 @@ static void print_intro_message(const char *runuser, const char *rungroup)
        }
 }
 
+static void main_atexit(void)
+{
+       ast_cli_unregister_multiple(cli_asterisk, ARRAY_LEN(cli_asterisk));
+}
+
 int main(int argc, char *argv[])
 {
        int c;
@@ -4066,7 +4088,9 @@ int main(int argc, char *argv[])
 #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();
 
index de8306c4a067cf0350da511b33921fdcc84b01e5..bf60e3ab729b2d9a35e0d0b352081bf4cdc119d4 100644 (file)
@@ -71,6 +71,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 #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 @@ static void *kqueue_daemon(void *data)
                        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 @@ static int gmtload(struct state *sp)
                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;