Author: coreyfarrell
Date: Wed Feb 18 20:01:34 2015
New Revision: 431917

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=431917
Log:
Create work around for scheduler leaks during shutdown.

* Added ast_sched_clean_by_callback for cleanup of scheduled events
  that have not yet fired.
* Run all pending peercnt_remove_cb and replace_callno events in chan_iax2.
  Cleanup of replace_callno events is only run 11, since it no longer
  releases any references or allocations in 13+.

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

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

Modified:
    branches/13/   (props changed)
    branches/13/channels/chan_iax2.c
    branches/13/include/asterisk/sched.h
    branches/13/main/sched.c

Propchange: branches/13/
------------------------------------------------------------------------------
--- branch-11-merged (original)
+++ branch-11-merged Wed Feb 18 20:01:34 2015
@@ -1,1 +1,1 @@
-/branches/11:1-429517,429539,429632,429783,429804,429825,429867,429893,429982,430009,430126,430415,430487,430506,430564,430589,430795,430798,430920,430993,430996-430997,431049,431135,431187,431218,431384,431423,431617,431662,431669,431673,431788
+/branches/11:1-429517,429539,429632,429783,429804,429825,429867,429893,429982,430009,430126,430415,430487,430506,430564,430589,430795,430798,430920,430993,430996-430997,431049,431135,431187,431218,431384,431423,431617,431662,431669,431673,431788,431916

Modified: branches/13/channels/chan_iax2.c
URL: 
http://svnview.digium.com/svn/asterisk/branches/13/channels/chan_iax2.c?view=diff&rev=431917&r1=431916&r2=431917
==============================================================================
--- branches/13/channels/chan_iax2.c (original)
+++ branches/13/channels/chan_iax2.c Wed Feb 18 20:01:34 2015
@@ -14692,7 +14692,6 @@
        ao2_ref(users, -1);
        ao2_ref(iax_peercallno_pvts, -1);
        ao2_ref(iax_transfercallno_pvts, -1);
-       ao2_ref(peercnts, -1);
        ao2_ref(callno_limits, -1);
        ao2_ref(calltoken_ignores, -1);
        if (timer) {
@@ -14700,8 +14699,11 @@
                timer = NULL;
        }
        transmit_processor = ast_taskprocessor_unreference(transmit_processor);
+
+       ast_sched_clean_by_callback(sched, peercnt_remove_cb, 
peercnt_remove_cb);
        ast_sched_context_destroy(sched);
        sched = NULL;
+       ao2_ref(peercnts, -1);
 
        con = ast_context_find(regcontext);
        if (con)

Modified: branches/13/include/asterisk/sched.h
URL: 
http://svnview.digium.com/svn/asterisk/branches/13/include/asterisk/sched.h?view=diff&rev=431917&r1=431916&r2=431917
==============================================================================
--- branches/13/include/asterisk/sched.h (original)
+++ branches/13/include/asterisk/sched.h Wed Feb 18 20:01:34 2015
@@ -170,6 +170,17 @@
 typedef int (*ast_sched_cb)(const void *data);
 #define AST_SCHED_CB(a) ((ast_sched_cb)(a))
 
+/*!
+ * \brief Clean all scheduled events with matching callback.
+ *
+ * \param con Scheduler Context
+ * \param match Callback to match
+ * \param cleanup_cb Callback to run
+ *
+ * \note The return of cleanup_cb is ignored. No events are rescheduled.
+ */
+void ast_sched_clean_by_callback(struct ast_sched_context *con, ast_sched_cb 
match, ast_sched_cb cleanup_cb);
+
 struct ast_cb_names {
        int numassocs;
        char *list[10];

Modified: branches/13/main/sched.c
URL: 
http://svnview.digium.com/svn/asterisk/branches/13/main/sched.c?view=diff&rev=431917&r1=431916&r2=431917
==============================================================================
--- branches/13/main/sched.c (original)
+++ branches/13/main/sched.c Wed Feb 18 20:01:34 2015
@@ -289,6 +289,26 @@
                sched_free(tmp);
 }
 
+void ast_sched_clean_by_callback(struct ast_sched_context *con, ast_sched_cb 
match, ast_sched_cb cleanup_cb)
+{
+       int i = 1;
+       struct sched *current;
+
+       ast_mutex_lock(&con->lock);
+       while ((current = ast_heap_peek(con->sched_heap, i))) {
+               if (current->callback != match) {
+                       i++;
+                       continue;
+               }
+
+               ast_heap_remove(con->sched_heap, current);
+
+               cleanup_cb(current->data);
+               sched_release(con, current);
+       }
+       ast_mutex_unlock(&con->lock);
+}
+
 /*! \brief
  * Return the number of milliseconds
  * until the next scheduled event


-- 
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

svn-commits mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/svn-commits

Reply via email to