aboutsummaryrefslogtreecommitdiffstats
path: root/channels/chan_iax.c
diff options
context:
space:
mode:
authormartinp <martinp@f38db490-d61c-443f-a65b-d21fe96a405b>2003-11-13 23:49:15 +0000
committermartinp <martinp@f38db490-d61c-443f-a65b-d21fe96a405b>2003-11-13 23:49:15 +0000
commit0ccf36d24d76845f905abf32bf8b83f497374d52 (patch)
tree91ad6a7a1ec86b3061562b6913bc13c46e1248a8 /channels/chan_iax.c
parent881f75c5eb68ce6dbd254bb400920c5d83c89f07 (diff)
Fix deadlock in iax
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@1745 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels/chan_iax.c')
-rwxr-xr-xchannels/chan_iax.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/channels/chan_iax.c b/channels/chan_iax.c
index ce36153e7..231eec572 100755
--- a/channels/chan_iax.c
+++ b/channels/chan_iax.c
@@ -3774,7 +3774,13 @@ static int socket_read(int *id, int fd, short events, void *cbdata)
ast_log(LOG_DEBUG, "Ooh, voice format changed to %s\n", ast_getformatname(f.subclass));
if (iaxs[fr.callno]->owner) {
int orignative;
- ast_mutex_lock(&iaxs[fr.callno]->owner->lock);
+retryowner:
+ if (ast_mutex_trylock(&iaxs[fr.callno]->owner->lock)) {
+ ast_mutex_unlock(&iaxsl[fr.callno]);
+ usleep(1);
+ ast_mutex_lock(&iaxsl[fr.callno]);
+ if (iaxs[fr.callno] && iaxs[fr.callno]->owner) goto retryowner;
+ }
orignative = iaxs[fr.callno]->owner->nativeformats;
iaxs[fr.callno]->owner->nativeformats = f.subclass;
if (iaxs[fr.callno]->owner->readformat)