]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
Merge branch 'davidy.ftdm_variables3' of git.sangoma.com:smg_freeswitch into davidy...
authorDavid Yat Sin <dyatsin@sangoma.com>
Fri, 25 Feb 2011 15:06:20 +0000 (10:06 -0500)
committerDavid Yat Sin <dyatsin@sangoma.com>
Fri, 25 Feb 2011 15:06:20 +0000 (10:06 -0500)
Conflicts:
libs/freetdm/src/ftdm_io.c

1  2 
libs/freetdm/src/ftdm_io.c

index 0b8d51facc455e0e710fbbe64d5944c41c40e450,251d9d4989e49f9c99ecf4c2a5a48ec9861cdfb6..4aea149234c25ecd133612cc77f0b22a33f52a1c
@@@ -2388,7 -2410,9 +2388,9 @@@ FT_DECLARE(ftdm_status_t) _ftdm_channel
        return FTDM_SUCCESS;
  }
  
 -static ftdm_status_t _ftdm_channel_call_place_nl(const char *file, const char *func, int line, ftdm_channel_t *ftdmchan)
+ /* this function MUST be called with the channel lock held with lock recursivity of 1 exactly, 
+  * and the caller must be aware we might unlock the channel for a brief period of time and then lock it again */
 +static ftdm_status_t _ftdm_channel_call_place_nl(const char *file, const char *func, int line, ftdm_channel_t *ftdmchan, ftdm_usrmsg_t *usrmsg)
  {
        ftdm_status_t status = FTDM_FAIL;
        
  
        ftdm_set_flag(ftdmchan, FTDM_CHANNEL_CALL_STARTED);
        ftdm_call_set_call_id(ftdmchan, &ftdmchan->caller_data);
-       if (!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_NONBLOCK)) {
-               ftdm_channel_set_state(file, func, line, ftdmchan, FTDM_CHANNEL_STATE_DIALING, 1, usrmsg);
-       } else {
-               ftdm_channel_set_state(file, func, line, ftdmchan, FTDM_CHANNEL_STATE_DIALING, 0, usrmsg);
+       /* if the signaling stack left the channel in state down on success, is expecting us to move to DIALING */
+       if (ftdmchan->state == FTDM_CHANNEL_STATE_DOWN) {
+               if (!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_NONBLOCK)) {
 -                      ftdm_channel_set_state(file, func, line, ftdmchan, FTDM_CHANNEL_STATE_DIALING, 1);      
++                      ftdm_channel_set_state(file, func, line, ftdmchan, FTDM_CHANNEL_STATE_DIALING, 1, usrmsg);      
+               } else {
 -                      ftdm_channel_set_state(file, func, line, ftdmchan, FTDM_CHANNEL_STATE_DIALING, 0);      
++                      ftdm_channel_set_state(file, func, line, ftdmchan, FTDM_CHANNEL_STATE_DIALING, 0, usrmsg);      
+               }
+       } else if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_STATE_CHANGE) &&
+                  !ftdm_test_flag(ftdmchan, FTDM_CHANNEL_NONBLOCK)) {
+               
+               ftdm_channel_unlock(ftdmchan);
+               ftdm_interrupt_wait(ftdmchan->state_completed_interrupt, 500);
+               ftdm_channel_lock(ftdmchan);
        }
  
  done:
@@@ -2450,7 -2486,8 +2464,8 @@@ FT_DECLARE(ftdm_status_t) _ftdm_channel
        ftdm_status_t status;
        ftdm_channel_lock(ftdmchan);
  
 -      status = _ftdm_channel_call_place_nl(file, func, line, ftdmchan);
+       /* be aware that _ftdm_channl_call_place_nl can unlock/lock the channel quickly if working in blocking mode  */
 +      status = _ftdm_channel_call_place_nl(file, func, line, ftdmchan, usrmsg);
  
        ftdm_channel_unlock(ftdmchan);
        return status;
@@@ -2493,9 -2530,10 +2508,10 @@@ FT_DECLARE(ftdm_status_t) _ftdm_call_pl
  
        ftdm_channel_set_caller_data(fchan, caller_data);
  
 -      status = _ftdm_channel_call_place_nl(file, func, line, fchan);
+       /* be aware that _ftdm_channl_call_place_nl can unlock/lock the channel quickly if working in blocking mode  */
 +      status = _ftdm_channel_call_place_nl(file, func, line, fchan, usrmsg);
        if (status != FTDM_SUCCESS) {
 -              _ftdm_channel_call_hangup_nl(file, func, line, fchan);
 +              _ftdm_channel_call_hangup_nl(file, func, line, fchan, usrmsg);
                goto done;
        }