Пример #1
0
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;
}
Пример #2
0
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);
}
Пример #3
0
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;
}
Пример #4
0
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;
}