aboutsummaryrefslogtreecommitdiffstats
path: root/channels
diff options
context:
space:
mode:
authorpcadach <pcadach@f38db490-d61c-443f-a65b-d21fe96a405b>2006-09-25 20:28:21 +0000
committerpcadach <pcadach@f38db490-d61c-443f-a65b-d21fe96a405b>2006-09-25 20:28:21 +0000
commitb4084dbed600221e0a9f67126630e61e37d71c70 (patch)
tree0cf49c32cfe680cb18bbf8b94f9671894711e5ad /channels
parent8596c6971c2a26b3892048dd537c0249005be8e7 (diff)
Backport changes of trunk:
1) r43540: Avoid possible deadlock on channel destruction 2) r43590: Disable fastStart if requested by remote side git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@43626 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_h323.c40
-rw-r--r--channels/h323/ast_h323.cxx9
2 files changed, 30 insertions, 19 deletions
diff --git a/channels/chan_h323.c b/channels/chan_h323.c
index f60da0fe8..f147cfe69 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 55af0d216..6a3eb7ec1 100644
--- a/channels/h323/ast_h323.cxx
+++ b/channels/h323/ast_h323.cxx
@@ -37,6 +37,7 @@
#include <ptlib.h>
#include <h323.h>
#include <h323pdu.h>
+#include <h323neg.h>
#include <mediafmt.h>
#include <lid.h>
@@ -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);
}