freetdm: on ftmod_r2, fixed flags for correctly polling the span, now freeing
poll_events pointer, enabling/disabling channel reading flag when needed. also removed the test for FTDM_CHANNEL_OPEN flag on ftdm_channel_wait().
This commit is contained in:
parent
2b0189beca
commit
9fbecc60be
|
@ -2869,11 +2869,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;
|
||||
|
|
|
@ -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");
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue