mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 10:47:18 +00:00 
			
		
		
		
	Modify ast_answer() to not hold the channel lock while calling ast_safe_sleep()
or when calling ast_waitfor(). These are inappropriate times to hold the channel lock. This is what has caused "could not get the channel lock" messages from chan_sip and has likely caused a negative impact on performance results of SIP in Asterisk 1.6. Thanks to file for pointing out this section of code. (closes issue #13287) (closes issue #13115) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@141949 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		| @@ -1674,16 +1674,21 @@ int __ast_answer(struct ast_channel *chan, unsigned int delay) | ||||
| 		return -1; | ||||
| 	} | ||||
|  | ||||
| 	ast_channel_unlock(chan); | ||||
|  | ||||
| 	switch (chan->_state) { | ||||
| 	case AST_STATE_RINGING: | ||||
| 	case AST_STATE_RING: | ||||
| 		if (chan->tech->answer) | ||||
| 		ast_channel_lock(chan); | ||||
| 		if (chan->tech->answer) { | ||||
| 			res = chan->tech->answer(chan); | ||||
| 		} | ||||
| 		ast_setstate(chan, AST_STATE_UP); | ||||
| 		ast_cdr_answer(chan->cdr); | ||||
| 		if (delay) | ||||
| 		ast_channel_unlock(chan); | ||||
| 		if (delay) { | ||||
| 			ast_safe_sleep(chan, delay); | ||||
| 		else { | ||||
| 		} else { | ||||
| 			struct ast_frame *f; | ||||
| 			int ms = ANSWER_WAIT_MS; | ||||
| 			while (1) { | ||||
| @@ -1719,8 +1724,8 @@ int __ast_answer(struct ast_channel *chan, unsigned int delay) | ||||
| 	default: | ||||
| 		break; | ||||
| 	} | ||||
|  | ||||
| 	chan->visible_indication = 0; | ||||
| 	ast_channel_unlock(chan); | ||||
|  | ||||
| 	return res; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user