aboutsummaryrefslogtreecommitdiffstats
path: root/main/translate.c
diff options
context:
space:
mode:
authorkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2006-10-24 03:53:32 +0000
committerkpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b>2006-10-24 03:53:32 +0000
commit567a07bbed48d6fa324b3a77d7a0b4983f662298 (patch)
treeaa6c2b66c2b551469e2aa2cfa99187f2001a35e0 /main/translate.c
parent6a53ae2cd676fa9045c0ef44b5dcb6c1fa6e6508 (diff)
ensure that the translation matrix is properly lock-protected every place it is used
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@46083 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main/translate.c')
-rw-r--r--main/translate.c28
1 files changed, 24 insertions, 4 deletions
diff --git a/main/translate.c b/main/translate.c
index f51822f3f..7b5ad0fc5 100644
--- a/main/translate.c
+++ b/main/translate.c
@@ -63,6 +63,9 @@ struct translator_path {
* until step->dstfmt == desired_format.
*
* Array indexes are 'src' and 'dest', in that order.
+ *
+ * Note: the lock in the 'translators' list is also used to protect
+ * this structure.
*/
static struct translator_path tr_matrix[MAX_FORMAT][MAX_FORMAT];
@@ -253,18 +256,22 @@ struct ast_trans_pvt *ast_translator_build_path(int dest, int source)
source = powerof(source);
dest = powerof(dest);
+ AST_LIST_LOCK(&translators);
+
while (source != dest) {
struct ast_trans_pvt *cur;
struct ast_translator *t = tr_matrix[source][dest].step;
if (!t) {
ast_log(LOG_WARNING, "No translator path from %s to %s\n",
ast_getformatname(source), ast_getformatname(dest));
+ AST_LIST_UNLOCK(&translators);
return NULL;
}
if (!(cur = newpvt(t))) {
ast_log(LOG_WARNING, "Failed to build translator step from %d to %d\n", source, dest);
if (head)
ast_translator_free_path(head);
+ AST_LIST_UNLOCK(&translators);
return NULL;
}
if (!head)
@@ -276,6 +283,8 @@ struct ast_trans_pvt *ast_translator_build_path(int dest, int source)
/* Keep going if this isn't the final destination */
source = cur->t->dstfmt;
}
+
+ AST_LIST_UNLOCK(&translators);
return head;
}
@@ -768,13 +777,20 @@ int ast_translator_best_choice(int *dst, int *srcs)
unsigned int ast_translate_path_steps(unsigned int dest, unsigned int src)
{
+ unsigned int res = -1;
+
/* convert bitwise format numbers into array indices */
src = powerof(src);
dest = powerof(dest);
- if (!tr_matrix[src][dest].step)
- return -1;
- else
- return tr_matrix[src][dest].multistep + 1;
+
+ AST_LIST_LOCK(&translators);
+
+ if (tr_matrix[src][dest].step)
+ res = tr_matrix[src][dest].multistep + 1;
+
+ AST_LIST_UNLOCK(&translators);
+
+ return res;
}
unsigned int ast_translate_available_formats(unsigned int dest, unsigned int src)
@@ -784,6 +800,8 @@ unsigned int ast_translate_available_formats(unsigned int dest, unsigned int src
unsigned int src_audio = powerof(src & AST_FORMAT_AUDIO_MASK);
unsigned int src_video = powerof(src & AST_FORMAT_VIDEO_MASK);
+ AST_LIST_LOCK(&translators);
+
for (x = 1; x < AST_FORMAT_MAX_AUDIO; x <<= 1) {
/* if this is not a desired format, nothing to do */
if (!dest & x)
@@ -817,5 +835,7 @@ unsigned int ast_translate_available_formats(unsigned int dest, unsigned int src
res &= ~x;
}
+ AST_LIST_UNLOCK(&translators);
+
return res;
}