diff options
author | martinp <martinp@f38db490-d61c-443f-a65b-d21fe96a405b> | 2003-11-13 23:49:15 +0000 |
---|---|---|
committer | martinp <martinp@f38db490-d61c-443f-a65b-d21fe96a405b> | 2003-11-13 23:49:15 +0000 |
commit | 0ccf36d24d76845f905abf32bf8b83f497374d52 (patch) | |
tree | 91ad6a7a1ec86b3061562b6913bc13c46e1248a8 /channels/chan_iax.c | |
parent | 881f75c5eb68ce6dbd254bb400920c5d83c89f07 (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-x | channels/chan_iax.c | 8 |
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) |