From b2b256eeef2cd06900fe5995e79b3ee28caabc2f Mon Sep 17 00:00:00 2001 From: Paul Cadach Date: Mon, 25 Sep 2006 20:28:21 +0000 Subject: [PATCH] Backport changes of trunk: 1) r43540: Avoid possible deadlock on channel destruction 2) r43590: Disable fastStart if requested by remote side git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@43626 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_h323.c | 40 ++++++++++++++++++++------------------ channels/h323/ast_h323.cxx | 9 +++++++++ 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/channels/chan_h323.c b/channels/chan_h323.c index f60da0fe8d..f147cfe698 100644 --- a/channels/chan_h323.c +++ b/channels/chan_h323.c @@ -2442,34 +2442,36 @@ static void *do_monitor(void *data) h323_do_reload(); } /* Check for interfaces needing to be killed */ - ast_mutex_lock(&iflock); + if (!ast_mutex_trylock(&iflock)) { #if 1 - do { - for (oh323 = iflist; oh323; oh323 = oh323->next) { + do { + for (oh323 = iflist; oh323; oh323 = oh323->next) { + if (!ast_mutex_trylock(&oh323->lock)) { + if (oh323->needdestroy) { + __oh323_destroy(oh323); + break; + } + ast_mutex_unlock(&oh323->lock); + } + } + } while (/*oh323*/ 0); +#else +restartsearch: + oh323 = iflist; + while(oh323) { if (!ast_mutex_trylock(&oh323->lock)) { if (oh323->needdestroy) { __oh323_destroy(oh323); - break; + goto restartsearch; } ast_mutex_unlock(&oh323->lock); + oh323 = oh323->next; } } - } while (/*oh323*/ 0); -#else -restartsearch: - oh323 = iflist; - while(oh323) { - if (!ast_mutex_trylock(&oh323->lock)) { - if (oh323->needdestroy) { - __oh323_destroy(oh323); - goto restartsearch; - } - ast_mutex_unlock(&oh323->lock); - oh323 = oh323->next; - } - } #endif - ast_mutex_unlock(&iflock); + ast_mutex_unlock(&iflock); + } else + oh323 = (struct oh323_pvt *)1; /* Force fast loop */ pthread_testcancel(); /* Wait for sched or io */ res = ast_sched_wait(sched); diff --git a/channels/h323/ast_h323.cxx b/channels/h323/ast_h323.cxx index 55af0d216e..6a3eb7ec15 100644 --- a/channels/h323/ast_h323.cxx +++ b/channels/h323/ast_h323.cxx @@ -37,6 +37,7 @@ #include #include #include +#include #include #include @@ -1105,6 +1106,14 @@ BOOL MyH323Connection::OnReceivedSignalSetup(const H323SignalPDU & setupPDU) SetCallOptions(res, TRUE); + /* Disable fastStart if requested by remote side */ + if (h245Tunneling && !setupPDU.m_h323_uu_pdu.m_h245Tunneling) { + masterSlaveDeterminationProcedure->Stop(); + capabilityExchangeProcedure->Stop(); + PTRACE(3, "H225\tFast Start DISABLED!"); + h245Tunneling = FALSE; + } + return H323Connection::OnReceivedSignalSetup(setupPDU); }