THREAD
当收到一次呼叫的时候, FS 会在 TU 层创建两个线程,一个线程为状态机线程,另外一个为消息线程。状态机线程通过 switch_core_session_thread_launch创建,顾名思义其作用是不断的检查channel 的状态,并进行处理。以下为详细处理过程。
状态机的执行机制:
2 个回调函数
分别为:
const switch_state_handler_table_t *driver_state_handler = NULL;
const switch_state_handler_table_t *application_state_handler = NULL;
下面为具体的代码分析:
FS 里面有大量的结构体,其变量的类型为函数指针。然后定义此结构,直接使用全局函数名称进行初始化。达到回调的效果。
例:
结构体
struct switch_state_handler_table {
/*! executed when the state changes to init */
switch_state_handler_t on_init;
/*! executed when the state changes to routing */
switch_state_handler_t on_routing;
。。。。/ 这里只显示部分
};
全局结构变量
switch_state_handler_table_t sofia_event_handlers = {
/*.on_init */ sofia_on_init,
/*.on_routing */ sofia_on_routing,
。。。
};
通过sofia_event_handlers 即可对所有的函数进行调用。
通过宏定义进行回调
#define STATE_MACRO(__STATE, __STATE_STR) do{....}while(...)
状态机的回调过程,下图:
概括为:
1、根据状态机的状态执行 mod_sofia 中对应的回调函数
2、根据状态机的状态执行 application 和 core 设置的对应的回调函数
3、如果状态没有发生改变根据状态机的状态执行对应的 standard 函数
l 状态机状态一览
typedef enum {
CS_NEW,
CS_INIT,
CS_ROUTING,
CS_SOFT_EXECUTE,
CS_EXECUTE,
CS_EXCHANGE_MEDIA,
CS_PARK,
CS_CONSUME_MEDIA,
CS_HIBERNATE,
CS_RESET,
CS_HANGUP,
CS_REPORTING,
CS_DESTROY,
CS_NONE
} switch_channel_state_t;
以上为呼叫过程中的所有状态机。其中标注蓝色的状态会根据当前状态执行状态机函数。
修改 channel 状态
当 channel 的状态发生改变,进行修改时,会进行唤醒动作,把之前进入 sleep 的 session 线程唤醒。然后从新执行状态机。
另外一个线程为消息线程,其功能为不断的从呼叫对应的消息队列里面取出消息,并进行处理,我在 SESSION 文档里面有过描述,会创建一个消息队列。
消息的处理会在消息队列里面进行描述。这里不再消息讲述。