[svn-commits] coreyfarrell: branch 1.8 r415463 - in /branches/1.8: include/ main/

SVN commits to the Digium repositories svn-commits at lists.digium.com
Sun Jun 8 22:43:30 CDT 2014


Author: coreyfarrell
Date: Sun Jun  8 22:43:21 2014
New Revision: 415463

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=415463
Log:
autoservice: stop thread on graceful shutdown

This change adds thread shutdown to autoservice for graceful shutdowns only.
ast_register_cleanup is backported to 1.8 to allow this.  The logger callid
is also released on shutdown in 11+.

ASTERISK-23827 #close
Reported by: Corey Farrell
Review: https://reviewboard.asterisk.org/r/3594/

Modified:
    branches/1.8/include/asterisk.h
    branches/1.8/main/asterisk.c
    branches/1.8/main/autoservice.c

Modified: branches/1.8/include/asterisk.h
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/include/asterisk.h?view=diff&rev=415463&r1=415462&r2=415463
==============================================================================
--- branches/1.8/include/asterisk.h (original)
+++ branches/1.8/include/asterisk.h Sun Jun  8 22:43:21 2014
@@ -90,6 +90,22 @@
 int ast_register_atexit(void (*func)(void));
 
 /*!
+ * \since 1.8.29
+ * \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/1.8/main/asterisk.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/main/asterisk.c?view=diff&rev=415463&r1=415462&r2=415463
==============================================================================
--- branches/1.8/main/asterisk.c (original)
+++ branches/1.8/main/asterisk.c Sun Jun  8 22:43:21 2014
@@ -209,6 +209,7 @@
 
 struct ast_atexit {
 	void (*func)(void);
+	int is_cleanup;
 	AST_LIST_ENTRY(ast_atexit) list;
 };
 
@@ -944,13 +945,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);
@@ -972,7 +973,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;
 
@@ -981,6 +982,7 @@
 		return -1;
 	}
 	ae->func = func;
+	ae->is_cleanup = is_cleanup;
 
 	AST_LIST_LOCK(&atexits);
 	__ast_unregister_atexit(func);
@@ -988,6 +990,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))
@@ -1748,8 +1760,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();
 	}
 
@@ -1791,7 +1804,7 @@
 
 	if (option_verbose)
 		ast_verbose("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/1.8/main/autoservice.c
URL: http://svnview.digium.com/svn/asterisk/branches/1.8/main/autoservice.c?view=diff&rev=415463&r1=415462&r2=415463
==============================================================================
--- branches/1.8/main/autoservice.c (original)
+++ branches/1.8/main/autoservice.c Sun Jun  8 22:43:21 2014
@@ -72,6 +72,7 @@
 static ast_cond_t as_cond;
 
 static pthread_t asthread = AST_PTHREADT_NULL;
+static volatile int asexit = 0;
 
 static int as_chan_list_state;
 
@@ -82,7 +83,7 @@
 		.subclass.integer = AST_CONTROL_HANGUP,
 	};
 
-	for (;;) {
+	while (!asexit) {
 		struct ast_channel *mons[MAX_AUTOMONS];
 		struct asent *ents[MAX_AUTOMONS];
 		struct ast_channel *chan;
@@ -320,7 +321,19 @@
 	return res;
 }
 
+static void autoservice_shutdown(void)
+{
+	pthread_t th = asthread;
+	asexit = 1;
+	if (th != AST_PTHREADT_NULL) {
+		ast_cond_signal(&as_cond);
+		pthread_kill(th, SIGURG);
+		pthread_join(th, NULL);
+	}
+}
+
 void ast_autoservice_init(void)
 {
+	ast_register_cleanup(autoservice_shutdown);
 	ast_cond_init(&as_cond, NULL);
 }




More information about the svn-commits mailing list