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文档里面有过描述,会创建一个消息队列。
消息的处理会在消息队列里面进行描述。这里不再消息讲述。