]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
Use the pendingchans queue only on request by signaling modules.
authorMoises Silva <moy@sangoma.com>
Mon, 5 Apr 2010 20:01:08 +0000 (16:01 -0400)
committerMoises Silva <moy@sangoma.com>
Mon, 5 Apr 2010 20:01:08 +0000 (16:01 -0400)
Remove suggest_chan_id member and add a span flag instead.

libs/freetdm/src/ftdm_io.c
libs/freetdm/src/ftmod/ftmod_isdn/ftmod_isdn.c
libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c
libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c
libs/freetdm/src/include/freetdm.h
libs/freetdm/src/include/ftdm_types.h

index 6a1b21c6ad32a731a64b1e2bed31c7e63843020e..1b27f91130308c89a9e1eca3666041f63a6bd48d 100644 (file)
@@ -412,7 +412,9 @@ static ftdm_status_t ftdm_span_destroy(ftdm_span_t *span)
        }
 
        /* destroy final basic resources of the span data structure */
-       ftdm_queue_destroy(&span->pendingchans);
+       if (span->pendingchans) {
+               ftdm_queue_destroy(&span->pendingchans);
+       }
        ftdm_mutex_unlock(span->mutex);
        ftdm_mutex_destroy(&span->mutex);
        ftdm_safe_free(span->signal_data);
@@ -518,9 +520,6 @@ FT_DECLARE(ftdm_status_t) ftdm_span_create(ftdm_io_interface_t *fio, ftdm_span_t
                status = ftdm_mutex_create(&new_span->mutex);
                ftdm_assert(status == FTDM_SUCCESS, "mutex creation failed\n");
 
-               status = ftdm_queue_create(&new_span->pendingchans, SPAN_PENDING_CHANS_QUEUE_SIZE);
-               ftdm_assert(status == FTDM_SUCCESS, "span chans queue creation failed\n");
-               
                ftdm_set_flag(new_span, FTDM_SPAN_CONFIGURED);
                new_span->span_id = ++globals.span_index;
                new_span->fio = fio;
@@ -1163,7 +1162,9 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_set_state(ftdm_channel_t *ftdmchan, ftdm_
 
                ftdm_mutex_lock(ftdmchan->span->mutex);
                ftdm_set_flag(ftdmchan->span, FTDM_SPAN_STATE_CHANGE);
-               ftdm_queue_enqueue(ftdmchan->span->pendingchans, ftdmchan);
+               if (ftdmchan->span->pendingchans) {
+                       ftdm_queue_enqueue(ftdmchan->span->pendingchans, ftdmchan);
+               }
                ftdm_mutex_unlock(ftdmchan->span->mutex);
 
                ftdmchan->last_state = ftdmchan->state; 
@@ -1329,7 +1330,7 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_open_by_span(uint32_t span_id, ftdm_direc
                        return FTDM_FAIL;
                }
 
-               if (span->channel_request && !span->suggest_chan_id) {
+               if (span->channel_request && !ftdm_test_flag(span, FTDM_SPAN_SUGGEST_CHAN_ID)) {
                        ftdm_set_caller_data(span, caller_data);
                        return span->channel_request(span, 0, direction, caller_data, ftdmchan);
                }
@@ -3266,6 +3267,9 @@ FT_DECLARE(ftdm_status_t) ftdm_configure_span(const char *type, ftdm_span_t *spa
                va_list ap;
                va_start(ap, sig_cb);
                status = mod->sig_configure(span, sig_cb, ap);
+               if (status == FTDM_SUCCESS && ftdm_test_flag(span, FTDM_SPAN_USE_CHAN_QUEUE)) {
+                       status = ftdm_queue_create(&span->pendingchans, SPAN_PENDING_CHANS_QUEUE_SIZE);
+               }
                va_end(ap);
        } else {
                ftdm_log(FTDM_LOG_ERROR, "can't find '%s'\n", type);
index 3445599d1358505aa3656ed8d83b98673ec18f12..e980ab8936c8b59183d31aa0cad75fd5e3055e98 100644 (file)
@@ -2385,7 +2385,7 @@ static FIO_SIG_CONFIGURE_FUNCTION(ftdm_isdn_configure_span)
 
        if ((isdn_data->opts & FTDM_ISDN_OPT_SUGGEST_CHANNEL)) {
                span->channel_request = isdn_channel_request;
-               span->suggest_chan_id = 1;
+               ftdm_set_flag(span, FTDM_SPAN_SUGGEST_CHAN_ID);
        }
        span->state_map = &isdn_state_map;
 
index 929a87465775e250e8a4eec5c0c0b5b5e7e01038..871769e49e86c8be03701b556bcb3a2a57f32fa8 100644 (file)
@@ -1331,7 +1331,7 @@ static FIO_SIG_CONFIGURE_FUNCTION(ftdm_libpri_configure_span)
 
        if ((isdn_data->opts & FTMOD_LIBPRI_OPT_SUGGEST_CHANNEL)) {
                span->channel_request = isdn_channel_request;
-               span->suggest_chan_id = 1;
+               ftdm_set_flag(span, FTDM_SPAN_SUGGEST_CHAN_ID);
        }
 
        span->state_map = &isdn_state_map;
index e7317e3679149d18bb9094cebfec32732b76f62c..c2ca3db7c4e344721d3ceec790392b903068656e 100644 (file)
@@ -2239,7 +2239,8 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_sangoma_boost_configure_span)
        span->get_span_sig_status = sangoma_boost_get_span_sig_status;
        span->set_span_sig_status = sangoma_boost_set_span_sig_status;
        span->state_map = &boost_state_map;
-       span->suggest_chan_id = 0;
+       ftdm_clear_flag(span, FTDM_SPAN_SUGGEST_CHAN_ID);
+       ftdm_set_flag(span, FTDM_SPAN_USE_CHAN_QUEUE);
        if (sigmod_iface) {
                /* the core will do the hunting */
                span->channel_request = NULL;
index 0900c62800622d02bf04e058ffffa2856148122d..04c30abc67a28dc603606e215fff48391eec9f1d 100644 (file)
@@ -654,7 +654,6 @@ struct ftdm_span {
        char *type;
        char *dtmf_hangup;
        size_t dtmf_hangup_len;
-       int suggest_chan_id;
        ftdm_state_map_t *state_map;
        ftdm_caller_data_t default_caller_data;
        ftdm_queue_t *pendingchans;
index 7260358c8f5c7fa9b3a61610861e5fd7ca00e764..cf12bc9a2c254a4ae849fcd11a702720f9869945 100644 (file)
@@ -325,7 +325,9 @@ typedef enum {
        FTDM_SPAN_STATE_CHANGE = (1 << 2),
        FTDM_SPAN_SUSPENDED = (1 << 3),
        FTDM_SPAN_IN_THREAD = (1 << 4),
-       FTDM_SPAN_STOP_THREAD = (1 << 5)
+       FTDM_SPAN_STOP_THREAD = (1 << 5),
+       FTDM_SPAN_USE_CHAN_QUEUE = (1 << 6),
+       FTDM_SPAN_SUGGEST_CHAN_ID = (1 << 7),
 } ftdm_span_flag_t;
 
 typedef enum {