[asterisk-commits] rmudgett: branch 12 r411701 - in /branches/12: main/ res/

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Fri Apr 4 12:53:32 CDT 2014


Author: rmudgett
Date: Fri Apr  4 12:53:20 2014
New Revision: 411701

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=411701
Log:
Add some asserts that were handy when looking for a stasis cache problem.

* Assert if a channel is destroyed but has the snapshot staging flag set.
In this case the final channel destruction snapshot would never get taken.

* Assert if what we just got out of the stasis cache is not what we were
looking for.  This assert would have saved several days searching for a
bug and a lot of my hair.

* Assert if the music on hold message posts could not find the associated
channel.  A crash will happen later when manager tries to send the MOH AMI
message.  This assert catches the problem when the stasis message is
posted instead of by the thread processing the defective message.

* Always generate a backtrace when an ast_assert() fails.

Review: https://reviewboard.asterisk.org/r/3411/

Modified:
    branches/12/main/channel.c
    branches/12/main/stasis_cache.c
    branches/12/main/utils.c
    branches/12/res/res_musiconhold.c

Modified: branches/12/main/channel.c
URL: http://svnview.digium.com/svn/asterisk/branches/12/main/channel.c?view=diff&rev=411701&r1=411700&r2=411701
==============================================================================
--- branches/12/main/channel.c (original)
+++ branches/12/main/channel.c Fri Apr  4 12:53:20 2014
@@ -884,9 +884,8 @@
 	ast_channel_stage_snapshot(tmp);
 
 	if (!(nativeformats = ast_format_cap_alloc(AST_FORMAT_CAP_FLAG_CACHE_STRINGS))) {
-		ao2_ref(tmp, -1);
 		/* format capabilities structure allocation failure */
-		return NULL;
+		return ast_channel_unref(tmp);
 	}
 	ast_channel_nativeformats_set(tmp, nativeformats);
 
@@ -2263,10 +2262,16 @@
 
 	/* Things that may possibly raise Stasis messages shouldn't occur after this point */
 	ast_set_flag(ast_channel_flags(chan), AST_FLAG_DEAD);
-	ast_channel_lock(chan);
-	ast_channel_publish_snapshot(chan);
-	ast_channel_unlock(chan);
-	publish_cache_clear(chan);
+
+	if (ast_channel_internal_is_finalized(chan)) {
+		/* A channel snapshot should not be in the process of being staged now. */
+		ast_assert(!ast_test_flag(ast_channel_flags(chan), AST_FLAG_SNAPSHOT_STAGE));
+
+		ast_channel_lock(chan);
+		ast_channel_publish_snapshot(chan);
+		ast_channel_unlock(chan);
+		publish_cache_clear(chan);
+	}
 
 	ast_channel_lock(chan);
 

Modified: branches/12/main/stasis_cache.c
URL: http://svnview.digium.com/svn/asterisk/branches/12/main/stasis_cache.c?view=diff&rev=411701&r1=411700&r2=411701
==============================================================================
--- branches/12/main/stasis_cache.c (original)
+++ branches/12/main/stasis_cache.c Fri Apr  4 12:53:20 2014
@@ -343,10 +343,17 @@
 static struct stasis_cache_entry *cache_find(struct ao2_container *entries, struct stasis_message_type *type, const char *id)
 {
 	struct cache_entry_key search_key;
+	struct stasis_cache_entry *entry;
 
 	search_key.type = type;
 	search_key.id = id;
-	return ao2_find(entries, &search_key, OBJ_SEARCH_KEY | OBJ_NOLOCK);
+	entry = ao2_find(entries, &search_key, OBJ_SEARCH_KEY | OBJ_NOLOCK);
+
+	/* Ensure that what we looked for is what we found. */
+	ast_assert(!entry
+		|| (!strcmp(stasis_message_type_name(entry->key.type),
+			stasis_message_type_name(type)) && !strcmp(entry->key.id, id)));
+	return entry;
 }
 
 /*!

Modified: branches/12/main/utils.c
URL: http://svnview.digium.com/svn/asterisk/branches/12/main/utils.c?view=diff&rev=411701&r1=411700&r2=411701
==============================================================================
--- branches/12/main/utils.c (original)
+++ branches/12/main/utils.c Fri Apr  4 12:53:20 2014
@@ -52,6 +52,7 @@
 #include "asterisk/sha1.h"
 #include "asterisk/cli.h"
 #include "asterisk/linkedlists.h"
+#include "asterisk/astobj2.h"
 
 #define AST_API_MODULE		/* ensure that inlinable API functions will be built in this module if required */
 #include "asterisk/strings.h"
@@ -2515,6 +2516,10 @@
 		condition_str, condition);
 	fprintf(stderr, "FRACK!, Failed assertion %s (%d) at line %d in %s of %s\n",
 		condition_str, condition, line, function, file);
+
+	/* Generate a backtrace for the assert */
+	ao2_bt();
+
 	/*
 	 * Give the logger a chance to get the message out, just in case
 	 * we abort(), or Asterisk crashes due to whatever problem just

Modified: branches/12/res/res_musiconhold.c
URL: http://svnview.digium.com/svn/asterisk/branches/12/res/res_musiconhold.c?view=diff&rev=411701&r1=411700&r2=411701
==============================================================================
--- branches/12/res/res_musiconhold.c (original)
+++ branches/12/res/res_musiconhold.c Fri Apr  4 12:53:20 2014
@@ -280,6 +280,9 @@
 	message = ast_channel_blob_create_from_cache(ast_channel_uniqueid(chan),
 		ast_channel_moh_start_type(), json_object);
 	if (message) {
+		/* A channel snapshot must have been in the cache. */
+		ast_assert(((struct ast_channel_blob *) stasis_message_data(message))->snapshot != NULL);
+
 		stasis_publish(ast_channel_topic(chan), message);
 	}
 	ao2_cleanup(message);
@@ -295,6 +298,9 @@
 	message = ast_channel_blob_create_from_cache(ast_channel_uniqueid(chan),
 		ast_channel_moh_stop_type(), NULL);
 	if (message) {
+		/* A channel snapshot must have been in the cache. */
+		ast_assert(((struct ast_channel_blob *) stasis_message_data(message))->snapshot != NULL);
+
 		stasis_publish(ast_channel_topic(chan), message);
 	}
 	ao2_cleanup(message);




More information about the asterisk-commits mailing list