[asterisk-commits] coreyfarrell: branch 11 r431916 - in /branches/11: channels/ include/asterisk...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Feb 18 19:59:14 CST 2015


Author: coreyfarrell
Date: Wed Feb 18 19:59:05 2015
New Revision: 431916

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=431916
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/

Modified:
    branches/11/channels/chan_iax2.c
    branches/11/include/asterisk/sched.h
    branches/11/main/sched.c

Modified: branches/11/channels/chan_iax2.c
URL: http://svnview.digium.com/svn/asterisk/branches/11/channels/chan_iax2.c?view=diff&rev=431916&r1=431915&r2=431916
==============================================================================
--- branches/11/channels/chan_iax2.c (original)
+++ branches/11/channels/chan_iax2.c Wed Feb 18 19:59:05 2015
@@ -14837,18 +14837,21 @@
 	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);
-	ao2_ref(callno_pool, -1);
-	ao2_ref(callno_pool_trunk, -1);
 	if (timer) {
 		ast_timer_close(timer);
 		timer = NULL;
 	}
 	transmit_processor = ast_taskprocessor_unreference(transmit_processor);
+
+	ast_sched_clean_by_callback(sched, peercnt_remove_cb, peercnt_remove_cb);
+	ast_sched_clean_by_callback(sched, replace_callno, replace_callno);
 	ast_sched_context_destroy(sched);
 	sched = NULL;
+	ao2_ref(peercnts, -1);
+	ao2_ref(callno_pool, -1);
+	ao2_ref(callno_pool_trunk, -1);
 
 	con = ast_context_find(regcontext);
 	if (con)

Modified: branches/11/include/asterisk/sched.h
URL: http://svnview.digium.com/svn/asterisk/branches/11/include/asterisk/sched.h?view=diff&rev=431916&r1=431915&r2=431916
==============================================================================
--- branches/11/include/asterisk/sched.h (original)
+++ branches/11/include/asterisk/sched.h Wed Feb 18 19:59:05 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/11/main/sched.c
URL: http://svnview.digium.com/svn/asterisk/branches/11/main/sched.c?view=diff&rev=431916&r1=431915&r2=431916
==============================================================================
--- branches/11/main/sched.c (original)
+++ branches/11/main/sched.c Wed Feb 18 19:59:05 2015
@@ -295,6 +295,31 @@
 		ast_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);
+		if (!ast_hashtab_remove_this_object(con->schedq_ht, current)) {
+			ast_log(LOG_ERROR,"Sched entry %d was in the schedq list but not in the hashtab???\n", current->id);
+		}
+
+		con->schedcnt--;
+
+		cleanup_cb(current->data);
+		sched_release(con, current);
+	}
+	ast_mutex_unlock(&con->lock);
+}
+
 /*! \brief
  * Return the number of milliseconds
  * until the next scheduled event




More information about the asterisk-commits mailing list