THREAD
當(dāng)收到一次呼叫的時(shí)候, FS 會(huì)在 TU 層創(chuàng)建兩個(gè)線程,一個(gè)線程為狀態(tài)機(jī)線程,另外一個(gè)為消息線程。狀態(tài)機(jī)線程通過 switch_core_session_thread_launch創(chuàng)建,顧名思義其作用是不斷的檢查channel 的狀態(tài),并進(jìn)行處理。以下為詳細(xì)處理過程。
狀態(tài)機(jī)的執(zhí)行機(jī)制:
2 個(gè)回調(diào)函數(shù)
分別為:
const?switch_state_handler_table_t?*driver_state_handler?=?NULL;
const?switch_state_handler_table_t?*application_state_handler?=?NULL;
?
下面為具體的代碼分析:
FS 里面有大量的結(jié)構(gòu)體,其變量的類型為函數(shù)指針。然后定義此結(jié)構(gòu),直接使用全局函數(shù)名稱進(jìn)行初始化。達(dá)到回調(diào)的效果。
例:
結(jié)構(gòu)體
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;
。。。。/ 這里只顯示部分
};
全局結(jié)構(gòu)變量
switch_state_handler_table_t?sofia_event_handlers?=?{
/*.on_init?*/?sofia_on_init,
/*.on_routing?*/?sofia_on_routing,
。。。
};
通過sofia_event_handlers 即可對(duì)所有的函數(shù)進(jìn)行調(diào)用。
?
通過宏定義進(jìn)行回調(diào)
#define?STATE_MACRO(__STATE,?__STATE_STR)??do{....}while(...)
?
狀態(tài)機(jī)的回調(diào)過程,下圖:
?
??概括為:
1、根據(jù)狀態(tài)機(jī)的狀態(tài)執(zhí)行 mod_sofia 中對(duì)應(yīng)的回調(diào)函數(shù)
2、根據(jù)狀態(tài)機(jī)的狀態(tài)執(zhí)行 application 和 core 設(shè)置的對(duì)應(yīng)的回調(diào)函數(shù)
3、如果狀態(tài)沒有發(fā)生改變根據(jù)狀態(tài)機(jī)的狀態(tài)執(zhí)行對(duì)應(yīng)的 standard 函數(shù)
?
l?狀態(tài)機(jī)狀態(tài)一覽
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;
以上為呼叫過程中的所有狀態(tài)機(jī)。其中標(biāo)注藍(lán)色的狀態(tài)會(huì)根據(jù)當(dāng)前狀態(tài)執(zhí)行狀態(tài)機(jī)函數(shù)。
修改 channel 狀態(tài)
當(dāng) channel 的狀態(tài)發(fā)生改變,進(jìn)行修改時(shí),會(huì)進(jìn)行喚醒動(dòng)作,把之前進(jìn)入 sleep 的 session 線程喚醒。然后從新執(zhí)行狀態(tài)機(jī)。
?
另外一個(gè)線程為消息線程,其功能為不斷的從呼叫對(duì)應(yīng)的消息隊(duì)列里面取出消息,并進(jìn)行處理,我在 SESSION 文檔里面有過描述,會(huì)創(chuàng)建一個(gè)消息隊(duì)列。
消息的處理會(huì)在消息隊(duì)列里面進(jìn)行描述。這里不再消息講述。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
