]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: on ftmod_r2, fixed flags for correctly polling the span, now freeing
authorArnaldo Pereira <arnaldo@sangoma.com>
Thu, 25 Nov 2010 02:36:01 +0000 (00:36 -0200)
committerArnaldo Pereira <arnaldo@sangoma.com>
Thu, 25 Nov 2010 17:49:43 +0000 (15:49 -0200)
         poll_events pointer, enabling/disabling channel reading flag when needed.
 also removed the test for FTDM_CHANNEL_OPEN flag on ftdm_channel_wait().

libs/freetdm/src/ftdm_io.c
libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c
libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c

index 246ebc07ba0434e4ffd2976c0f4568e4a1f81edf..c36b265735a4638d6dd37d26e02ab058b74db13c 100644 (file)
@@ -2871,11 +2871,6 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_wait(ftdm_channel_t *ftdmchan, ftdm_wait_
        assert(ftdmchan != NULL);
        assert(ftdmchan->fio != NULL);
 
-    if (!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OPEN)) {
-               snprintf(ftdmchan->last_error, sizeof(ftdmchan->last_error), "channel not open");
-        return FTDM_FAIL;
-    }
-
        if (!ftdmchan->fio->wait) {
                snprintf(ftdmchan->last_error, sizeof(ftdmchan->last_error), "method not implemented");
                return FTDM_FAIL;
index 8a4a826906173446f3f8ceb39c9fe0605b5dcdfc..52c0f86e6c911600aa2bf776bec6fcb061ddbfd5 100644 (file)
@@ -781,7 +781,7 @@ static int ftdm_r2_io_wait(openr2_chan_t *r2chan, int *flags, int block)
        int32_t timeout;
        ftdm_wait_flag_t ftdmflags = 0;
 
-       ftdm_channel_t *ftdm_chan = openr2_chan_get_fd(r2chan);
+       ftdm_channel_t *fchan = openr2_chan_get_fd(r2chan);
        timeout = block ? -1 : 0;
 
        if (*flags & OR2_IO_READ) {
@@ -794,9 +794,10 @@ static int ftdm_r2_io_wait(openr2_chan_t *r2chan, int *flags, int block)
                ftdmflags |= FTDM_EVENTS;
        }
        
-       status = ftdm_channel_wait(ftdm_chan, &ftdmflags, timeout);
+       status = ftdm_channel_wait(fchan, &ftdmflags, timeout);
 
        if (FTDM_SUCCESS != status && FTDM_TIMEOUT != status) {
+               ftdm_log_chan_msg(fchan, FTDM_LOG_ERROR, "Failed to wait for events on channel\n");
                return -1;
        }
 
@@ -869,7 +870,6 @@ static int ftdm_r2_io_get_oob_event(openr2_chan_t *r2chan, openr2_oob_event_t *e
                        }
                        break;
        }
-    ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "returning event: %s\n", ftdm_signal_event2str(*event));
     return 0;
 }
 
@@ -1212,6 +1212,7 @@ static int ftdm_r2_state_advance(ftdm_channel_t *ftdmchan)
                                        ftdm_channel_command(ftdmchan, FTDM_COMMAND_GET_INTERVAL, &interval);
                                        ftdm_assert(interval != 0, "Invalid interval!");
                                        ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Starting processing of incoming call with interval %d\n", interval);
+                                       openr2_chan_enable_read(r2chan);
                                }
                                break;
 
@@ -1223,6 +1224,7 @@ static int ftdm_r2_state_advance(ftdm_channel_t *ftdmchan)
                                        ftdm_assert(interval != 0, "Invalid interval!");
                                        ftdm_log_chan(ftdmchan, 
                                                FTDM_LOG_DEBUG, "Starting processing of outgoing call in channel with interval %d\n", interval);
+                                       openr2_chan_enable_read(r2chan);
                                }
                                break;
 
@@ -1289,7 +1291,6 @@ static int ftdm_r2_state_advance(ftdm_channel_t *ftdmchan)
                                {
                                        openr2_call_disconnect_cause_t disconnect_cause = ftdm_r2_ftdm_cause_to_openr2_cause(ftdmchan);
                                        ftdm_log_chan(ftdmchan, FTDM_LOG_DEBUG, "Clearing call, cause = %s\n", openr2_proto_get_disconnect_string(disconnect_cause));
-                                       openr2_chan_enable_read(r2chan);
                                        if (!R2CALL(ftdmchan)->disconnect_rcvd) {
                                                /* this will disconnect the call, but need to wait for the call end before moving to DOWN */
                                                openr2_chan_disconnect_call(r2chan, disconnect_cause);
@@ -1304,7 +1305,6 @@ static int ftdm_r2_state_advance(ftdm_channel_t *ftdmchan)
                        case FTDM_CHANNEL_STATE_CANCEL:
                                {
                                        ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "Unable to receive call\n");
-                                       openr2_chan_enable_read(r2chan);
                                        openr2_chan_disconnect_call(r2chan, OR2_CAUSE_OUT_OF_ORDER);
                                }
                                break;
@@ -1316,6 +1316,7 @@ static int ftdm_r2_state_advance(ftdm_channel_t *ftdmchan)
                                        if (R2CALL(ftdmchan)->txdrops) {
                                                ftdm_log_chan(ftdmchan, FTDM_LOG_WARNING, "dropped %d tx packets\n", R2CALL(ftdmchan)->txdrops);
                                        }
+                                       openr2_chan_disable_read(r2chan);
                                        ret = 1;
                                }
                                break;
@@ -1385,7 +1386,10 @@ static void *ftdm_r2_run(ftdm_thread_t *me, void *obj)
                for (i = 0; i < span->chan_count; i++) {
                        r2chan = R2CALL(span->channels[(i+1)])->r2chan;
                        ftdmchan = openr2_chan_get_client_data(r2chan);
-                       poll_events[i] = ftdmchan->state == FTDM_CHANNEL_STATE_DOWN ? POLLPRI : (POLLPRI | POLLIN | POLLOUT);
+                       poll_events[i] = POLLPRI;
+                       if (openr2_chan_get_read_enabled(r2chan)) {
+                               poll_events[i] |= POLLIN;
+                       }
                }
 
                status = ftdm_span_poll_event(span, waitms, poll_events);
@@ -1426,6 +1430,8 @@ static void *ftdm_r2_run(ftdm_thread_t *me, void *obj)
                openr2_chan_set_blocked(r2chan);
        }
 
+       ftdm_safe_free(poll_events);
+
        ftdm_clear_flag(r2data, FTDM_R2_RUNNING);
        ftdm_log(FTDM_LOG_DEBUG, "R2 thread ending.\n");
 
index 1a43c4db5034bca492be7cf72550d3cedc2469f1..c55d42e8b01110ed8352a7b953ebb7cb5e22605d 100644 (file)
@@ -1131,10 +1131,8 @@ FIO_CHANNEL_NEXT_EVENT_FUNCTION(wanpipe_channel_next_event)
        memset(&tdm_api, 0, sizeof(tdm_api));
        status = sangoma_tdm_read_event(ftdmchan->sockfd, &tdm_api);
        if (status != FTDM_SUCCESS) {
-#if 0
                snprintf(span->last_error, sizeof(span->last_error), "%s", strerror(errno));
                ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Failed to read event from channel: %s\n", strerror(errno));
-#endif
                return FTDM_FAIL;
        }