summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorey Farrell <git@cfware.com>2014-10-05 00:48:06 +0000
committerCorey Farrell <git@cfware.com>2014-10-05 00:48:06 +0000
commit9e3b5be1820cc2d1403258742c1a6a8758acdf32 (patch)
treea3059facd82cec9084202fc3829aa4daeb0ff270
parent0904b18fcc71ab4a84b8a906e8d4c3a2a70393c1 (diff)
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 git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/13@424580 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--main/manager.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/main/manager.c b/main/manager.c
index 6c1edc5be..e535bca4d 100644
--- a/main/manager.c
+++ b/main/manager.c
@@ -1253,6 +1253,9 @@ struct stasis_subscription *test_suite_sub;
#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 @@ static int process_events(struct mansession *s)
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 @@ int __ast_manager_event_multichan(int category, const char *event, int chancount
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));
@@ -8095,6 +8102,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");
ast_manager_unregister("Logoff");