[asterisk-addons-commits] trunk - r185 /trunk/asterisk-ooh323c/src/chan_h323.c

asterisk-addons-commits at lists.digium.com asterisk-addons-commits at lists.digium.com
Fri Dec 9 12:45:48 CST 2005


Author: objsys
Date: Fri Dec  9 12:45:47 2005
New Revision: 185

URL: http://svn.digium.com/view/asterisk-addons?rev=185&view=rev
Log:
Fixed 4 deadlocks
conditions in onAlerting, onReceivedDigit and onCallExstablished fun
tions

Modified:
    trunk/asterisk-ooh323c/src/chan_h323.c

Modified: trunk/asterisk-ooh323c/src/chan_h323.c
URL: http://svn.digium.com/view/asterisk-addons/trunk/asterisk-ooh323c/src/chan_h323.c?rev=185&r1=184&r2=185&view=diff
==============================================================================
--- trunk/asterisk-ooh323c/src/chan_h323.c (original)
+++ trunk/asterisk-ooh323c/src/chan_h323.c Fri Dec  9 12:45:47 2005
@@ -16,8 +16,6 @@
 
 
 #include "chan_h323.h"
-
-
 
 
 /* Defaults */
@@ -1054,18 +1052,22 @@
          ast_log(LOG_ERROR, "Could not create ast_channel\n");
          return -1;
       }
-    
-   }else{
+      ast_mutex_unlock(&p->lock);
+   }
+   else{
       if (!p->owner) {
          ast_mutex_unlock(&p->lock);
          ast_log(LOG_ERROR, "Channel has no owner\n");
          return 0;
       }
       c = p->owner;
+      ast_mutex_unlock(&p->lock);
+      ast_mutex_lock(&c->lock);
       ast_setstate(c, AST_STATE_RINGING);
+      ast_mutex_unlock(&c->lock);
       ast_queue_control(c, AST_CONTROL_RINGING);
-   }   
-   ast_mutex_unlock(&p->lock);
+   }
+   
 
    if(gH323Debug)
       ast_verbose("+++ onAlerting %s\n", call->callToken);
@@ -1100,8 +1102,8 @@
    f.data = NULL;
    f.mallocd = 0;
    f.src = "SEND_DIGIT";	
+   ast_mutex_unlock(&p->lock);
    res = ast_queue_frame(p->owner, &f);
-   ast_mutex_unlock(&p->lock);
    return res;
 }
 
@@ -1331,8 +1333,7 @@
       ast_verbose("---   onCallEstablished %s\n", call->callToken);
 
    p = find_call(call);
-   if(!p)
-   {
+   if(!p) {
       ast_log(LOG_ERROR, "Failed to find a matching call.\n");
       return -1;
    }
@@ -1343,15 +1344,24 @@
       return -1;
    }
    
+   while(ast_mutex_trylock(&p->owner->lock))
+   {
+      ast_log(LOG_DEBUG,"Failed to grab lock, trying again\n");
+      ast_mutex_unlock(&p->lock);
+      usleep(1);
+      ast_mutex_lock(&p->lock);
+   }    
    if(p->owner->_state != AST_STATE_UP)
    {
-      ast_mutex_lock(&p->owner->lock);
       ast_setstate(p->owner, AST_STATE_UP);
-      ast_mutex_unlock(&p->owner->lock);
-   }
-   if(ast_test_flag(p, H323_OUTGOING))
-      ast_queue_control(p->owner, AST_CONTROL_ANSWER);
-   ast_mutex_unlock(&p->lock);
+   }
+   ast_mutex_unlock(&p->owner->lock);
+   if(ast_test_flag(p, H323_OUTGOING)) {
+      struct ast_channel* c = p->owner;
+      ast_mutex_unlock(&p->lock);
+      ast_queue_control(c, AST_CONTROL_ANSWER);
+   }
+   else { ast_mutex_unlock(&p->lock); }
 
    if(gH323Debug)
       ast_verbose("+++   onCallEstablished %s\n", call->callToken);
@@ -2433,20 +2443,17 @@
       }
       /* Check for interfaces needing to be killed */
       ast_mutex_lock(&iflock);
-      int b_restartsearch = 1;
-      while(b_restartsearch) {
-         time(&t);
-         h323 = iflist;
-         b_restartsearch = 0;
-         while(h323) {
-            /*TODO: Need to add rtptimeout keepalive support */
-            if(ast_test_flag(h323, H323_NEEDDESTROY)) {
-               ooh323_destroy(h323);
-               b_restartsearch = 1;
-               break;
-            }
-            h323 = h323->next;
+      struct ooh323_pvt *h323_next;
+      time(&t);
+      h323 = iflist;
+      while(h323) {
+         h323_next = h323->next;
+
+         /*TODO: Need to add rtptimeout keepalive support */
+         if(ast_test_flag(h323, H323_NEEDDESTROY)) {
+            ooh323_destroy (h323);
          }
+         h323 = h323_next;
       }
       ast_mutex_unlock(&iflock);
       pthread_testcancel();
@@ -3078,7 +3085,3 @@
 }
 
 
-
-
-
-



More information about the asterisk-addons-commits mailing list