Merged revisions 301946 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.8 ........ r301946 | rmudgett | 2011-01-14 15:09:57 -0600 (Fri, 14 Jan 2011) | 13 lines Deadlock between dahdi_request() and pri_dchannel() processing an incomming call. The sig_pri_new_ast_channel() is called with the channel private lock held when pri_dchannel() calls it and no channel private lock held when dahdi_request() calls it. The use of pri_grab() in sig_pri_new_ast_channel() could leave the channel private lock held when it returns if the lock was not held before calling it. Make sig_pri_new_ast_channel() just lock the PRI span lock instead of using pri_grab(). It is safe to do this because dahdi_request() does not have the channel private lock and the deadlock potential with the PRI span lock is only between pri_dchannel() and other threads. ........ git-svn-id: http://svn.digium.com/svn/asterisk/trunk@301947 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
parent
5d619a6b74
commit
16cff562b8
|
@ -880,11 +880,10 @@ static struct ast_channel *sig_pri_new_ast_channel(struct sig_pri_chan *p, int s
|
|||
if (transfercapability & AST_TRANS_CAP_DIGITAL) {
|
||||
sig_pri_set_digital(p, 1);
|
||||
}
|
||||
if (p->pri && !pri_grab(p, p->pri)) {
|
||||
if (p->pri) {
|
||||
ast_mutex_lock(&p->pri->lock);
|
||||
sig_pri_span_devstate_changed(p->pri);
|
||||
pri_rel(p->pri);
|
||||
} else {
|
||||
ast_log(LOG_WARNING, "Failed to grab PRI!\n");
|
||||
ast_mutex_unlock(&p->pri->lock);
|
||||
}
|
||||
|
||||
return c;
|
||||
|
|
Reference in New Issue