[asterisk-commits] jrose: trunk r391453 - in /trunk: bridges/ include/asterisk/ main/

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue Jun 11 17:21:38 CDT 2013


Author: jrose
Date: Tue Jun 11 17:21:36 2013
New Revision: 391453

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=391453
Log:
bridge_native_rtp: Fix native bridge tech being incompatible when it should be.

When checking compatability for the native RTP bridge technology there is a
race condition between clearing framehooks that are destroyed when leaving
certain bridges with certain technologies (such as bridge_native_rtp) and
joining bridges with the bridge_native_rtp technology. Yes, that means a
channel in a native RTP bridge could move to another native RTP bridge and
be considered incompatible with the new native RTP bridge causing it to
revert to a simple bridge technology0. This fixes that bug by ignoring
framehooks that have been marked for destruction when checking for
compatibility with the bridge_native_rtp technology.

Modified:
    trunk/bridges/bridge_native_rtp.c
    trunk/include/asterisk/framehook.h
    trunk/main/framehook.c

Modified: trunk/bridges/bridge_native_rtp.c
URL: http://svnview.digium.com/svn/asterisk/trunk/bridges/bridge_native_rtp.c?view=diff&rev=391453&r1=391452&r2=391453
==============================================================================
--- trunk/bridges/bridge_native_rtp.c (original)
+++ trunk/bridges/bridge_native_rtp.c Tue Jun 11 17:21:36 2013
@@ -87,7 +87,7 @@
 {
 	if (ast_channel_monitor(chan) || (ast_channel_audiohooks(chan) &&
 		!ast_audiohook_write_list_empty(ast_channel_audiohooks(chan))) ||
-		!ast_framehook_list_is_empty(ast_channel_framehooks(chan))) {
+		!ast_framehook_list_contains_no_active(ast_channel_framehooks(chan))) {
 		return 0;
 	} else {
 		return 1;

Modified: trunk/include/asterisk/framehook.h
URL: http://svnview.digium.com/svn/asterisk/trunk/include/asterisk/framehook.h?view=diff&rev=391453&r1=391452&r2=391453
==============================================================================
--- trunk/include/asterisk/framehook.h (original)
+++ trunk/include/asterisk/framehook.h Tue Jun 11 17:21:36 2013
@@ -222,7 +222,7 @@
  * \param chan ast_channel The channel to attach the hook on to.
  * \param i framehook interface, The framehook's callback functions and stored data.
  *
- * \pre XXX The Channel must be locked during this function all.
+ * \pre The Channel must be locked during this function all.
  *
  * \note The data pointer is never touched by the framehook API except to
  * provide it during the event and destruction callbacks.  It is entirely up to the
@@ -237,7 +237,7 @@
  * \brief Detach an framehook from a channel.
  * \since 1.8
  * 
- * \pre XXX The Channel must be locked during this function all.
+ * \pre The Channel must be locked during this function all.
  * If this function is never called after attaching an framehook,
  * the framehook will be detached and destroyed during channel
  * destruction.
@@ -256,7 +256,7 @@
  * framehooks on a channel during channel destruction.
  * \since 1.8
  *
- * \pre XXX The Channel must be locked during this function all.
+ * \pre The Channel must be locked during this function all.
  * 
  * \param chan channel containing the framehook list to destroy.
  * \retval 0 success
@@ -272,7 +272,7 @@
  * even NULL.  There is nothing to keep up with after this function. If the frame is modified, the
  * framehook callback is in charge of any memory management associated with that modification.
  *
- * \pre XXX The Channel must be locked during this function all.
+ * \pre The Channel must be locked during this function all.
  *
  * \param framehooks list to push event to.
  * \param frame being pushed to the framehook list.
@@ -289,7 +289,7 @@
  * even NULL.  There is nothing to keep up with after this function. If the frame is modified, the
  * framehook callback is in charge of any memory management associated with that modification.
  *
- * \pre XXX The Channel must be locked during this function all.
+ * \pre The Channel must be locked during this function all.
  *
  * \param framehooks list to push event to.
  * \param frame being pushed to the framehook list.
@@ -301,11 +301,26 @@
 /*!
  * \brief Determine if an framehook list is empty or not
  * \since 1.8
- * \pre XXX The Channel must be locked during this function all.
+ * \pre The Channel must be locked during this function all.
  *
  * \param framehooks the framehook list
  * \retval 0, not empty
  * \retval 1, is empty
  */
 int ast_framehook_list_is_empty(struct ast_framehook_list *framehooks);
+
+/*!
+ * \brief Determine if a framehook list is free of active framehooks or not
+ * \since 12.0.0
+ * \pre The channel must be locked during this function all.
+ *
+ * \param framehooks the framehook list
+ * \retval 0, not empty
+ * \retval 1, is empty (aside from dying framehooks)
+ *
+ * \note This function is very similar to ast_framehook_list_is_empty, but it checks individual
+ *       framehooks to see if they have been marked for destruction and doesn't count them if they are.
+ */
+int ast_framehook_list_contains_no_active(struct ast_framehook_list *framehooks);
+
 #endif /* _AST_FRAMEHOOK_H */

Modified: trunk/main/framehook.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/framehook.c?view=diff&rev=391453&r1=391452&r2=391453
==============================================================================
--- trunk/main/framehook.c (original)
+++ trunk/main/framehook.c Tue Jun 11 17:21:36 2013
@@ -181,6 +181,28 @@
 	return AST_LIST_EMPTY(&framehooks->list) ? 1 : 0;
 }
 
+int ast_framehook_list_contains_no_active(struct ast_framehook_list *framehooks)
+{
+	struct ast_framehook *cur;
+
+	if (!framehooks) {
+		return 1;
+	}
+
+	if (AST_LIST_EMPTY(&framehooks->list)) {
+		return 1;
+	}
+
+	AST_LIST_TRAVERSE(&framehooks->list, cur, list) {
+		if (cur->detach_and_destroy_me) {
+			continue;
+		}
+		return 0;
+	}
+
+	return 1;
+}
+
 struct ast_frame *ast_framehook_list_write_event(struct ast_framehook_list *framehooks, struct ast_frame *frame)
 {
 	return framehook_list_push_event(framehooks, frame, AST_FRAMEHOOK_EVENT_WRITE);




More information about the asterisk-commits mailing list