[asterisk-commits] coreyfarrell: branch 13 r424580 - in /branches/13: ./ main/manager.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Sat Oct 4 19:48:10 CDT 2014


Author: coreyfarrell
Date: Sat Oct  4 19:48:06 2014
New Revision: 424580

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=424580
Log:
Release AMI connections on shutdown.

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

Merged revisions 424578 from http://svn.asterisk.org/svn/asterisk/branches/11
........

Merged revisions 424579 from http://svn.asterisk.org/svn/asterisk/branches/12

Modified:
    branches/13/   (props changed)
    branches/13/main/manager.c

Propchange: branches/13/
------------------------------------------------------------------------------
Binary property 'branch-12-merged' - no diff available.

Modified: branches/13/main/manager.c
URL: http://svnview.digium.com/svn/asterisk/branches/13/main/manager.c?view=diff&rev=424580&r1=424579&r2=424580
==============================================================================
--- branches/13/main/manager.c (original)
+++ branches/13/main/manager.c Sat Oct  4 19:48:06 2014
@@ -1253,6 +1253,9 @@
 
 #define MAX_VARS 128
 
+/*! \brief Fake event class used to end sessions at shutdown */
+#define EVENT_FLAG_SHUTDOWN -1
+
 /*! \brief
  * Descriptor for a manager session, either on the AMI socket or over HTTP.
  *
@@ -5382,6 +5385,10 @@
 		struct eventqent *eqe = s->session->last_ev;
 
 		while ((eqe = advance_event(eqe))) {
+			if (eqe->category == EVENT_FLAG_SHUTDOWN) {
+				ast_debug(3, "Received CloseSession event\n");
+				ret = -1;
+			}
 			if (!ret && s->session->authenticated &&
 			    (s->session->readperm & eqe->category) == eqe->category &&
 			    (s->session->send_events & eqe->category) == eqe->category) {
@@ -6312,7 +6319,7 @@
 		ao2_iterator_destroy(&i);
 	}
 
-	if (!AST_RWLIST_EMPTY(&manager_hooks)) {
+	if (category != EVENT_FLAG_SHUTDOWN && !AST_RWLIST_EMPTY(&manager_hooks)) {
 		AST_RWLIST_RDLOCK(&manager_hooks);
 		AST_RWLIST_TRAVERSE(&manager_hooks, hook, list) {
 			hook->helper(category, event, ast_str_buffer(buf));
@@ -8094,6 +8101,9 @@
 static void manager_shutdown(void)
 {
 	struct ast_manager_user *user;
+
+	/* This event is not actually transmitted, but causes all TCP sessions to be closed */
+	manager_event(EVENT_FLAG_SHUTDOWN, "CloseSession", "CloseSession: true\r\n");
 
 	ast_manager_unregister("Ping");
 	ast_manager_unregister("Events");




More information about the asterisk-commits mailing list