len = frame->datalen;
if (ftdm_channel_write(tech_pvt->ftdmchan, frame->data, frame->buflen, &len) != FTDM_SUCCESS) {
if (++tech_pvt->wr_error > 10) {
+ switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "too many I/O write errors!\n");
goto fail;
}
} else {
ftdm_sigmsg_t sig;
ftdm_status_t status;
- ftdm_log(FTDM_LOG_DEBUG, "%d:%d STATE [%s]\n", ftdmchan->span_id, ftdmchan->chan_id, ftdm_channel_state2str(ftdmchan->state));
+ ftdm_log(FTDM_LOG_DEBUG, "%d:%d PROCESSING STATE [%s]\n", ftdmchan->span_id, ftdmchan->chan_id, ftdm_channel_state2str(ftdmchan->state));
memset(&sig, 0, sizeof(sig));
sig.chan_id = ftdmchan->chan_id;
}
} else {
while ((ftdmchan = ftdm_queue_dequeue(span->pendingchans))) {
+ /* it can happen that someone else processed the chan states
+ * but without taking the chan out of the queue, so check th
+ * flag before advancing the state */
ftdm_mutex_lock(ftdmchan->mutex);
- ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_STATE_CHANGE);
- state_advance(ftdmchan);
- ftdm_channel_complete_state(ftdmchan);
+ if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_STATE_CHANGE)) {
+ ftdm_clear_flag(ftdmchan, FTDM_CHANNEL_STATE_CHANGE);
+ state_advance(ftdmchan);
+ ftdm_channel_complete_state(ftdmchan);
+ }
ftdm_mutex_unlock(ftdmchan->mutex);
}
}