diff options
author | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-10-16 13:32:09 +0000 |
---|---|---|
committer | kpfleming <kpfleming@f38db490-d61c-443f-a65b-d21fe96a405b> | 2008-10-16 13:32:09 +0000 |
commit | 73a897df068485fce96ac4603bed3c3d0b64f3b4 (patch) | |
tree | dc40ef0cb5db4c59d4820448eca0d5811b3eb1fb /channels | |
parent | 69eb0f309b088f723580600b2f411f201f9bf1ef (diff) |
Merged revisions 149981 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk
........
r149981 | kpfleming | 2008-10-16 15:28:56 +0200 (Thu, 16 Oct 2008) | 3 lines
return this logic to where it used to be, *after* the dialog->needdestroy flag has been determined to be set; otherwise, we generate these debug messages every time we inspect every active dialog
........
git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.1@149995 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_sip.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 31d5ac7c9..fcc9a4337 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -12791,6 +12791,7 @@ static int dialog_needdestroy(void *dialogobj, void *arg, int flags) time_t *t = arg; /* log_show_lock(ao2_object_get_lockaddr(dialog)); this is an example of how to use log_show_lock() */ + if (sip_pvt_trylock(dialog)) { /* In very short-duration calls via sipp, this path gets executed fairly frequently (3% or so) even in low load @@ -12801,6 +12802,7 @@ static int dialog_needdestroy(void *dialogobj, void *arg, int flags) ao2_unlock(dialogs); usleep(1); ao2_lock(dialogs); + /* I had previously returned CMP_STOP here; but changed it to return a zero instead, because there is no need to stop at the first sign of trouble. The old algorithm would restart in such circumstances, @@ -12813,18 +12815,6 @@ static int dialog_needdestroy(void *dialogobj, void *arg, int flags) return 0; } - /* We absolutely cannot destroy the rtp struct while a bridge is active or we WILL crash */ - if (dialog->rtp && ast_rtp_get_bridged(dialog->rtp)) { - ast_debug(2, "Bridge still active. Delaying destroy of SIP dialog '%s' Method: %s\n", dialog->callid, sip_methods[dialog->method].text); - sip_pvt_unlock(dialog); - return 0; - } - - if (dialog->vrtp && ast_rtp_get_bridged(dialog->vrtp)) { - ast_debug(2, "Bridge still active. Delaying destroy of SIP dialog '%s' Method: %s\n", dialog->callid, sip_methods[dialog->method].text); - sip_pvt_unlock(dialog); - return 0; - } /* Check RTP timeouts and kill calls if we have a timeout set and do not get RTP */ check_rtp_timeout(dialog, *t); @@ -12832,13 +12822,28 @@ static int dialog_needdestroy(void *dialogobj, void *arg, int flags) /* Check if we have outstanding requests not responsed to or an active call - if that's the case, wait with destruction */ if (dialog->needdestroy && !dialog->packets && !dialog->owner) { + /* We absolutely cannot destroy the rtp struct while a bridge is active or we WILL crash */ + if (dialog->rtp && ast_rtp_get_bridged(dialog->rtp)) { + ast_debug(2, "Bridge still active. Delaying destruction of SIP dialog '%s' Method: %s\n", dialog->callid, sip_methods[dialog->method].text); + sip_pvt_unlock(dialog); + return 0; + } + + if (dialog->vrtp && ast_rtp_get_bridged(dialog->vrtp)) { + ast_debug(2, "Bridge still active. Delaying destroy of SIP dialog '%s' Method: %s\n", dialog->callid, sip_methods[dialog->method].text); + sip_pvt_unlock(dialog); + return 0; + } + sip_pvt_unlock(dialog); /* no, the unlink should handle this: dialog_unref(dialog, "needdestroy: one more refcount decrement to allow dialog to be destroyed"); */ /* the CMP_MATCH will unlink this dialog from the dialog hash table */ dialog_unlink_all(dialog, TRUE, FALSE); return 0; /* the unlink_all should unlink this from the table, so.... no need to return a match */ } + sip_pvt_unlock(dialog); + return 0; } |