static ftdm_status_t ftdm_pritap_start(ftdm_span_t *span) { ftdm_status_t ret; pritap_t *pritap = span->signal_data; pritap_t *p_pritap = pritap->peerspan->signal_data; if (ftdm_test_flag(pritap, PRITAP_RUNNING)) { return FTDM_FAIL; } ftdm_mutex_create(&pritap->pcalls_lock); ftdm_clear_flag(span, FTDM_SPAN_STOP_THREAD); ftdm_clear_flag(span, FTDM_SPAN_IN_THREAD); ftdm_set_flag(pritap, PRITAP_RUNNING); if (p_pritap && ftdm_test_flag(p_pritap, PRITAP_RUNNING)) { /* our peer already started, we're the master */ ftdm_set_flag(pritap, PRITAP_MASTER); } ret = ftdm_thread_create_detached(ftdm_pritap_run, span); if (ret != FTDM_SUCCESS) { return ret; } return ret; }
static ftdm_status_t ftdm_gsm_start(ftdm_span_t *span) { if (wat_span_start(span->span_id)) { ftdm_log(FTDM_LOG_ERROR, "Failed to start span %s!\n", span->name); return FTDM_SUCCESS; } return ftdm_thread_create_detached(ftdm_gsm_run, span); }
static FIO_SIGNAL_CB_FUNCTION(on_signal) { ftdm_log(FTDM_LOG_DEBUG, "got sig [%s]\n", ftdm_signal_event2str(sigmsg->event_id)); switch(sigmsg->event_id) { case FTDM_SIGEVENT_START: ftdm_set_state_locked(sigmsg->channel, FTDM_CHANNEL_STATE_RING); ftdm_log(FTDM_LOG_DEBUG, "launching thread and indicating ring\n"); ftdm_thread_create_detached(test_call, sigmsg->channel); break; default: break; } return FTDM_SUCCESS; }
FT_DECLARE(ftdm_status_t) ftdm_sched_free_run(ftdm_sched_t *sched) { ftdm_status_t status = FTDM_FAIL; ftdm_assert_return(sched != NULL, FTDM_EINVAL, "invalid pointer\n"); ftdm_mutex_lock(sched->mutex); ftdm_mutex_lock(sched_globals.mutex); if (sched->freerun) { ftdm_log(FTDM_LOG_ERROR, "Schedule %s is already running in free run\n", sched->name); goto done; } sched->freerun = 1; if (sched_globals.running == FTDM_FALSE) { ftdm_log(FTDM_LOG_NOTICE, "Launching main schedule thread\n"); status = ftdm_thread_create_detached(run_main_schedule, NULL); if (status != FTDM_SUCCESS) { ftdm_log(FTDM_LOG_CRIT, "Failed to launch main schedule thread\n"); goto done; } sched_globals.running = FTDM_TRUE; } ftdm_log(FTDM_LOG_DEBUG, "Running schedule %s in the main schedule thread\n", sched->name); status = FTDM_SUCCESS; /* Add the schedule to the global list of free runs */ if (!sched_globals.freeruns) { sched_globals.freeruns = sched; } else { sched->next = sched_globals.freeruns; sched_globals.freeruns->prev = sched; sched_globals.freeruns = sched; } done: ftdm_mutex_unlock(sched_globals.mutex); ftdm_mutex_unlock(sched->mutex); return status; }