]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
ftmod_libpri: Possible fix for call tear-down problems (+ locking cleanup)
authorMarkus Mueller <edv@birkeneck.de>
Sat, 30 Apr 2011 16:01:38 +0000 (18:01 +0200)
committerStefan Knoblich <s.knoblich@axsentis.de>
Sat, 30 Apr 2011 16:16:46 +0000 (18:16 +0200)
Remove pri_destroycall() in on_hangup() and
use pri_hangup() instead of the deprecated pri_release().

NOTE: The original patch used PRI_CAUSE_NORMAL_CIRCUIT_CONGESTION for the cause
      code, which (without pri_enable_hangup_fix() enabled) emits a RELEASE COMPLETE
      message. This version of the patch uses PRI_CAUSE_NORMAL_CLEARING (-1). (stkn)

Additionally, use ftdm_set_state() instead of ftdm_set_state_locked() because the channel
is already locked. (stkn)

Completely-untested-by: Stefan Knoblich <stkn@openisdn.net>
libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c

index 0f45128ac9c4bf33fc64f870bf13b3a85cec1e51..949ea154e3e75d37e75294074765e379ee3983fa 100644 (file)
@@ -854,7 +854,6 @@ static int on_hangup(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_even
 {
        ftdm_span_t *span = spri->span;
        ftdm_channel_t *chan = ftdm_span_get_channel(span, pevent->hangup.channel);
-/*     q931_call *call = NULL; */
 
        if (!chan) {
                ftdm_log(FTDM_LOG_CRIT, "-- Hangup on channel %d:%d %s but it's not in use?\n", ftdm_span_get_id(spri->span), pevent->hangup.channel);
@@ -868,25 +867,13 @@ static int on_hangup(lpwrap_pri_t *spri, lpwrap_pri_event_t event_type, pri_even
                goto done;
        }
 
-/*
- * Make sure we can really tear-down a call, simply ignore the missing call_data and
- * use the call handle from the event
- *
-       if (!chan->call_data) {
-               ftdm_log_chan(chan, FTDM_LOG_DEBUG, "Ignoring remote hangup in state %s with no call data\n", ftdm_channel_get_state_str(chan));
-               goto done;
-       }
-
-       call = (q931_call *)chan->call_data;
-*/
        ftdm_log(FTDM_LOG_DEBUG, "-- Hangup on channel %d:%d\n", ftdm_span_get_id(spri->span), pevent->hangup.channel);
 
-       pri_release(spri->pri, pevent->hangup.call, 0);
-       pri_destroycall(spri->pri, pevent->hangup.call);
+       pri_hangup(spri->pri, pevent->hangup.call, -1);
 
        chan->caller_data.hangup_cause = pevent->hangup.cause;
        chan->call_data = NULL;
-       ftdm_set_state_locked(chan, FTDM_CHANNEL_STATE_TERMINATING);
+       ftdm_set_state(chan, FTDM_CHANNEL_STATE_TERMINATING);
 done:
        ftdm_channel_unlock(chan);
        return 0;