[svn-commits] mmichelson: branch group/issue8824 r183440 - in /team/group/issue8824: channe...

SVN commits to the Digium repositories svn-commits at lists.digium.com
Thu Mar 19 16:07:11 CDT 2009


Author: mmichelson
Date: Thu Mar 19 16:07:07 2009
New Revision: 183440

URL: http://svn.digium.com/svn-view/asterisk?view=rev&rev=183440
Log:
Fix potential locking problems in chan_local.

Make the build_connected_line_data and build_redirecting_data functions
public so that chan_local can construct a proper frame and pass it to the
other side.


Modified:
    team/group/issue8824/channels/chan_local.c
    team/group/issue8824/include/asterisk/channel.h
    team/group/issue8824/main/channel.c

Modified: team/group/issue8824/channels/chan_local.c
URL: http://svn.digium.com/svn-view/asterisk/team/group/issue8824/channels/chan_local.c?view=diff&rev=183440&r1=183439&r2=183440
==============================================================================
--- team/group/issue8824/channels/chan_local.c (original)
+++ team/group/issue8824/channels/chan_local.c Thu Mar 19 16:07:07 2009
@@ -426,11 +426,16 @@
 			the_other_channel = p->chan;
 		}
 		if (the_other_channel) {
-			/*XXX investigate later for potential deadlock issues */
+			unsigned char frame_data[1024];
 			if (condition == AST_CONTROL_CONNECTED_LINE) {
-				ast_queue_connected_line_update(the_other_channel, &this_channel->connected);
+				f.datalen = ast_build_connected_line_data(frame_data, sizeof(frame_data), &this_channel->connected);
 			} else {
-				ast_queue_redirecting_update(the_other_channel, &this_channel->redirecting);
+				f.datalen = ast_build_redirecting_data(frame_data, sizeof(frame_data), &this_channel->redirecting);
+			}
+			f.subclass = condition;
+			f.data.ptr = frame_data;
+			if (!(res = local_queue_frame(p, isoutbound, &f, ast, 1))) {
+				ast_mutex_unlock(&p->lock);
 			}
 		}
 	} else {

Modified: team/group/issue8824/include/asterisk/channel.h
URL: http://svn.digium.com/svn-view/asterisk/team/group/issue8824/include/asterisk/channel.h?view=diff&rev=183440&r1=183439&r2=183440
==============================================================================
--- team/group/issue8824/include/asterisk/channel.h (original)
+++ team/group/issue8824/include/asterisk/channel.h Thu Mar 19 16:07:07 2009
@@ -2172,6 +2172,19 @@
 void ast_set_connected_line(struct ast_channel *chan, const struct ast_party_connected_line *connected);
 
 /*!
+ * \internal
+ * \brief Build the connected line information data frame.
+ *
+ * \param data Buffer to fill with the frame data
+ * \param datalen Size of the buffer to fill
+ * \param connected Connected line information
+ *
+ * \retval -1 if error
+ * \retval Amount of data buffer used
+ */
+int ast_build_connected_line_data(unsigned char *data, size_t datalen, const struct ast_party_connected_line *connected);
+
+/*!
  * \brief Parse connected line indication frame data
  *
  * \param data Buffer with the frame data to parse
@@ -2222,6 +2235,18 @@
 void ast_set_redirecting(struct ast_channel *chan, const struct ast_party_redirecting *redirecting);
 
 /*!
+ * \brief Build the redirecting id data frame.
+ *
+ * \param data Buffer to fill with the frame data
+ * \param datalen Size of the buffer to fill
+ * \param redirecting Redirecting id information
+ *
+ * \retval -1 if error
+ * \retval Amount of data buffer used
+ */
+int ast_build_redirecting_data(unsigned char *data, size_t datalen, const struct ast_party_redirecting *redirecting);
+
+/*!
  * \brief Parse redirecting indication frame data
  *
  * \param data Buffer with the frame data to parse

Modified: team/group/issue8824/main/channel.c
URL: http://svn.digium.com/svn-view/asterisk/team/group/issue8824/main/channel.c?view=diff&rev=183440&r1=183439&r2=183440
==============================================================================
--- team/group/issue8824/main/channel.c (original)
+++ team/group/issue8824/main/channel.c Thu Mar 19 16:07:07 2009
@@ -6007,18 +6007,7 @@
 
 
 /* ******************************************************************* */
-/*!
- * \internal
- * \brief Build the connected line information data frame.
- *
- * \param data Buffer to fill with the frame data
- * \param datalen Size of the buffer to fill
- * \param connected Connected line information
- *
- * \retval -1 if error
- * \retval Amount of data buffer used
- */
-static int build_connected_line_data(unsigned char *data, size_t datalen, const struct ast_party_connected_line *connected)
+int ast_build_connected_line_data(unsigned char *data, size_t datalen, const struct ast_party_connected_line *connected)
 {
 	int32_t value;
 	size_t length;
@@ -6082,7 +6071,7 @@
 	pos += sizeof(value);
 
 	return pos;
-}	/* end build_connected_line_data() */
+}	/* end ast_build_connected_line_data() */
 
 
 
@@ -6168,7 +6157,7 @@
 	unsigned char data[1024];	/* This should be large enough */
 	size_t datalen;
 
-	datalen = build_connected_line_data(data, sizeof(data), connected);
+	datalen = ast_build_connected_line_data(data, sizeof(data), connected);
 	if (datalen == (size_t) -1) {
 		return;
 	}
@@ -6185,7 +6174,7 @@
 	unsigned char data[1024];	/* This should be large enough */
 	size_t datalen;
 
-	datalen = build_connected_line_data(data, sizeof(data), connected);
+	datalen = ast_build_connected_line_data(data, sizeof(data), connected);
 	if (datalen == (size_t) -1) {
 		return;
 	}
@@ -6250,18 +6239,7 @@
 
 
 /* ******************************************************************* */
-/*!
- * \internal
- * \brief Build the redirecting id data frame.
- *
- * \param data Buffer to fill with the frame data
- * \param datalen Size of the buffer to fill
- * \param redirecting Redirecting id information
- *
- * \retval -1 if error
- * \retval Amount of data buffer used
- */
-static int build_redirecting_data(unsigned char *data, size_t datalen, const struct ast_party_redirecting *redirecting)
+int ast_build_redirecting_data(unsigned char *data, size_t datalen, const struct ast_party_redirecting *redirecting)
 {
 	int32_t value;
 	size_t length;
@@ -6377,7 +6355,7 @@
 	pos += sizeof(value);
 
 	return pos;
-}	/* end build_redirecting_data() */
+}	/* end ast_build_redirecting_data() */
 
 
 
@@ -6505,7 +6483,7 @@
 	unsigned char data[1024];	/* This should be large enough */
 	size_t datalen;
 
-	datalen = build_redirecting_data(data, sizeof(data), redirecting);
+	datalen = ast_build_redirecting_data(data, sizeof(data), redirecting);
 	if (datalen == (size_t) -1) {
 		return;
 	}
@@ -6522,7 +6500,7 @@
 	unsigned char data[1024];	/* This should be large enough */
 	size_t datalen;
 
-	datalen = build_redirecting_data(data, sizeof(data), redirecting);
+	datalen = ast_build_redirecting_data(data, sizeof(data), redirecting);
 	if (datalen == (size_t) -1) {
 		return;
 	}




More information about the svn-commits mailing list