static __inline__ void pritap_check_state(ftdm_span_t *span) { if (ftdm_test_flag(span, FTDM_SPAN_STATE_CHANGE)) { uint32_t j; ftdm_clear_flag_locked(span, FTDM_SPAN_STATE_CHANGE); for(j = 1; j <= span->chan_count; j++) { ftdm_channel_lock(span->channels[j]); ftdm_channel_advance_states(span->channels[j]); ftdm_channel_unlock(span->channels[j]); } } }
static void *ftdm_gsm_run(ftdm_thread_t *me, void *obj) { ftdm_log(FTDM_LOG_INFO,"ftdm_gsm_run\r\n"); ftdm_channel_t *ftdmchan = NULL; ftdm_span_t *span = (ftdm_span_t *) obj; ftdm_gsm_span_data_t *gsm_data = NULL; ftdm_interrupt_t *data_sources[2] = {NULL, NULL}; int waitms = 0; gsm_data = span->signal_data; ftdm_assert_return(gsm_data != NULL, NULL, "No gsm data attached to span\n"); ftdm_log(FTDM_LOG_DEBUG, "GSM monitor thread for span %s started\n", span->name); if (!gsm_data->dchan || ftdm_channel_open_chan(gsm_data->dchan) != FTDM_SUCCESS) { ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Failed to open GSM d-channel of span %s!\n", span->name); gsm_data->dchan = NULL; goto done; } while (ftdm_running()) { wat_span_run(span->span_id); waitms = wat_span_schedule_next(span->span_id); if (waitms > GSM_POLL_INTERVAL_MS) { waitms = GSM_POLL_INTERVAL_MS; } ///////////////////// { ftdm_wait_flag_t flags = FTDM_READ | FTDM_EVENTS; ftdm_status_t status = ftdm_channel_wait(gsm_data->dchan, &flags, waitms); /* double check that this channel has a state change pending */ ftdm_channel_lock(gsm_data->bchan); ftdm_channel_advance_states(gsm_data->bchan); if(FTDM_SUCCESS == status ) { if(flags &FTDM_READ ) { char buffer[1025]; int n = 0, m = 0; memset(buffer, 0, sizeof(buffer)); n = read_channel(gsm_data->dchan, buffer, sizeof(buffer)-1); m = strlen(buffer); wat_span_process_read(span->span_id, buffer, m); #if LOG_SIG_DATA printf("<<======================= incomming data len = %d, %s\r\n", n, buffer); #endif } } ftdm_channel_advance_states(gsm_data->bchan); ftdm_channel_unlock(gsm_data->bchan); } ftdm_span_trigger_signals(span); } done: if (data_sources[0]) { ftdm_interrupt_destroy(&data_sources[0]); } ftdm_log(FTDM_LOG_DEBUG, "GSM thread ending.\n"); return NULL; }