summaryrefslogtreecommitdiff
path: root/channels/chan_iax2.c
diff options
context:
space:
mode:
authorMark Spencer <markster@digium.com>2003-05-22 03:08:39 +0000
committerMark Spencer <markster@digium.com>2003-05-22 03:08:39 +0000
commit36934104267bb2debf69fe4727df63d1005a739a (patch)
treec551d90bd490607586c23080c6c8340a575ddf2b /channels/chan_iax2.c
parentcee8ab8dc0ccc313c3769a7b28dd8251282723e1 (diff)
Fix another deadlock in IAX2
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1049 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels/chan_iax2.c')
-rwxr-xr-xchannels/chan_iax2.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index a2bdc2c03..f7faa0ab2 100755
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -3829,13 +3829,27 @@ static int socket_read(int *id, int fd, short events, void *cbdata)
ast_log(LOG_DEBUG, "Ooh, voice format changed to %d\n", f.subclass);
if (iaxs[fr.callno]->owner) {
int orignative;
- ast_pthread_mutex_lock(&iaxs[fr.callno]->owner->lock);
- orignative = iaxs[fr.callno]->owner->nativeformats;
- iaxs[fr.callno]->owner->nativeformats = f.subclass;
- if (iaxs[fr.callno]->owner->readformat)
- ast_set_read_format(iaxs[fr.callno]->owner, iaxs[fr.callno]->owner->readformat);
- iaxs[fr.callno]->owner->nativeformats = orignative;
- ast_pthread_mutex_unlock(&iaxs[fr.callno]->owner->lock);
+retryowner:
+ if (pthread_mutex_trylock(&iaxs[fr.callno]->owner->lock)) {
+ ast_pthread_mutex_unlock(&iaxsl[fr.callno]);
+ usleep(1);
+ ast_pthread_mutex_lock(&iaxsl[fr.callno]);
+ if (iaxs[fr.callno] && iaxs[fr.callno]->owner) goto retryowner;
+ }
+ if (iaxs[fr.callno]) {
+ if (iaxs[fr.callno]->owner) {
+ orignative = iaxs[fr.callno]->owner->nativeformats;
+ iaxs[fr.callno]->owner->nativeformats = f.subclass;
+ if (iaxs[fr.callno]->owner->readformat)
+ ast_set_read_format(iaxs[fr.callno]->owner, iaxs[fr.callno]->owner->readformat);
+ iaxs[fr.callno]->owner->nativeformats = orignative;
+ ast_pthread_mutex_unlock(&iaxs[fr.callno]->owner->lock);
+ }
+ } else {
+ ast_log(LOG_DEBUG, "Neat, somebody took away the channel at a magical time but i found it!\n");
+ ast_pthread_mutex_unlock(&iaxsl[fr.callno]);
+ return 1;
+ }
}
}
}