From: David Yat Sin Date: Fri, 25 Feb 2011 15:06:20 +0000 (-0500) Subject: Merge branch 'davidy.ftdm_variables3' of git.sangoma.com:smg_freeswitch into davidy... X-Git-Tag: v1.2-rc1~172^2~8^2~1^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4b613f426c12281300159a5043183ec284d50435;p=thirdparty%2Ffreeswitch.git Merge branch 'davidy.ftdm_variables3' of git.sangoma.com:smg_freeswitch into davidy.ftdm_variables3 Conflicts: libs/freetdm/src/ftdm_io.c --- 4b613f426c12281300159a5043183ec284d50435 diff --cc libs/freetdm/src/ftdm_io.c index 0b8d51facc,251d9d4989..4aea149234 --- a/libs/freetdm/src/ftdm_io.c +++ b/libs/freetdm/src/ftdm_io.c @@@ -2388,7 -2410,9 +2388,9 @@@ FT_DECLARE(ftdm_status_t) _ftdm_channel return FTDM_SUCCESS; } + /* 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) +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; @@@ -2430,10 -2454,22 +2432,22 @@@ 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); + /* 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); + 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); + /* 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); + 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; }