[asterisk-commits] mmichelson: branch 10 r372885 - in /branches/10: include/asterisk/ main/

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue Sep 11 16:04:40 CDT 2012


Author: mmichelson
Date: Tue Sep 11 16:04:36 2012
New Revision: 372885

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=372885
Log:
Fix inability to shutdown gracefully due to an unending channel reference.

message.c makes use of a special message queue channel that exists
in thread storage. This channel never goes away due to the fact that
the taskprocessor used by message.c does not get shut down, meaning
that it never ends the thread that stores the channel.

This patch fixes the problem by shutting down the taskprocessor when
Asterisk is shut down. In addition, the thread storage has a destructor
that will release the channel reference when the taskprocessor is destroyed.

(closes issue AST-937)
Reported by Jason Parker
Patches:
	AST-937.patch uploaded by Mark Michelson (License #5049)
Tested by Jason Parker


Modified:
    branches/10/include/asterisk/_private.h
    branches/10/main/asterisk.c
    branches/10/main/message.c

Modified: branches/10/include/asterisk/_private.h
URL: http://svnview.digium.com/svn/asterisk/branches/10/include/asterisk/_private.h?view=diff&rev=372885&r1=372884&r2=372885
==============================================================================
--- branches/10/include/asterisk/_private.h (original)
+++ branches/10/include/asterisk/_private.h Tue Sep 11 16:04:36 2012
@@ -48,6 +48,7 @@
 int ast_ssl_init(void);                 /*!< Provided by ssl.c */
 int ast_test_init(void);            /*!< Provided by test.c */
 int ast_msg_init(void);             /*!< Provided by message.c */
+void ast_msg_shutdown(void);        /*!< Provided by message.c */
 
 /*!
  * \brief Reload asterisk modules.

Modified: branches/10/main/asterisk.c
URL: http://svnview.digium.com/svn/asterisk/branches/10/main/asterisk.c?view=diff&rev=372885&r1=372884&r2=372885
==============================================================================
--- branches/10/main/asterisk.c (original)
+++ branches/10/main/asterisk.c Tue Sep 11 16:04:36 2012
@@ -1693,6 +1693,7 @@
 	 * (if in batch mode). really_quit happens to call it again when running
 	 * the atexit handlers, otherwise this would be a bit early. */
 	ast_cdr_engine_term();
+	ast_msg_shutdown();
 
 	if (niceness == SHUTDOWN_NORMAL) {
 		time_t s, e;

Modified: branches/10/main/message.c
URL: http://svnview.digium.com/svn/asterisk/branches/10/main/message.c?view=diff&rev=372885&r1=372884&r2=372885
==============================================================================
--- branches/10/main/message.c (original)
+++ branches/10/main/message.c Tue Sep 11 16:04:36 2012
@@ -705,7 +705,18 @@
 	ast_channel_unlock(chan);
 }
 
-AST_THREADSTORAGE(msg_q_chan);
+static void destroy_msg_q_chan(void *data)
+{
+	struct ast_channel **chan = data;
+
+	if (!*chan) {
+		return;
+	}
+
+	ast_channel_release(*chan);
+}
+
+AST_THREADSTORAGE_CUSTOM(msg_q_chan, NULL, destroy_msg_q_chan);
 
 /*!
  * \internal
@@ -1132,3 +1143,8 @@
 
 	return res;
 }
+
+void ast_msg_shutdown(void)
+{
+	msg_q_tp = ast_taskprocessor_unreference(msg_q_tp);
+}




More information about the asterisk-commits mailing list