]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Backport changes of trunk:
authorPaul Cadach <paul@odt.east.telecom.kz>
Mon, 25 Sep 2006 20:28:21 +0000 (20:28 +0000)
committerPaul Cadach <paul@odt.east.telecom.kz>
Mon, 25 Sep 2006 20:28:21 +0000 (20:28 +0000)
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
channels/h323/ast_h323.cxx

index f60da0fe8d4dfbe4c1d43bb209d2d95b299b1e4e..f147cfe698b6c77e46a67ca1598905c61ae86d4c 100644 (file)
@@ -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);
index 55af0d216e55234adffaeabf49ddccbfb2f1a30b..6a3eb7ec15970aac12cddf4505afd4a6121acc74 100644 (file)
@@ -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);
 }