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 文檔里面有過描述,會創建一個消息隊列。
消息的處理會在消息隊列里面進行描述。這里不再消息講述。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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