FS SIP呼叫的訊息執行緒和狀態機執行緒

2022-04-11 07:41:09 字數 918 閱讀 7028

當收到一次呼叫的時候,fs

會在tu

層建立兩個執行緒,乙個執行緒為狀態機執行緒,另外乙個為訊息執行緒。狀態機執行緒通過switch_core_session_thread_launch建立,顧名思義其作用是不斷的檢查channel的狀態,並進行處理。以下為詳細處理過程。

狀態機的執行機制:

2個**函式

分別為:

const switch_state_handler_table_t *driver_state_handler = null;

下面為具體的**分析:

fs裡面有大量的結構體,其變數的型別為函式指標。然後定義此結構,直接使用全域性函式名稱進行初始化。達到**的效果。

例:結構體

struct switch_state_handler_table while(...)

狀態機的**過程,下圖:

概括為:

1、根據狀態機的狀態執行mod_sofia

中對應的**函式

和core

設定的對應的**函式

3、如果狀態沒有發生改變根據狀態機的狀態執行對應的standard

函式l 狀態機狀態一覽

typedef enum  switch_channel_state_t;

以上為呼叫過程中的所有狀態機。其中標註藍色的狀態會根據當前狀態執行狀態機函式。

修改channel

狀態當channel

的狀態發生改變,進行修改時,會進行喚醒動作,把之前進入

sleep

的session

執行緒喚醒。然後從新執行狀態機。

另外乙個執行緒為訊息執行緒,其功能為不斷的從呼叫對應的訊息佇列裡面取出訊息,並進行處理,我在session

文件裡面有過描述,會建立乙個訊息佇列。

訊息的處理會在訊息佇列裡面進行描述。這裡不再訊息講述。

Lua的執行緒和狀態

那不是真的多執行緒 lua不支援真正的多執行緒,這句話我在 lua中的協同程式 這篇文章中就已經說了。根據我的程式設計經驗,在開發過程中,如果可以避免使用執行緒,那就堅決不用執行緒,如果實在沒有更好的辦法,那就只能退而用之。為什麼?首先,多個執行緒之間的通訊比較麻煩,同時,執行緒之間共享記憶體,對於...

6 執行緒的狀態和名字

import threading 執行緒名字 class mythread threading.thread def run self if name main t mythread name downloadthread t.start 2.執行緒的執行順序 import time class m...

執行緒的宣告週期和狀態

新建 new 新建立乙個執行緒 就緒 runnable 執行緒物件建立後,其他執行緒呼叫了該物件的start方法,該狀態的執行緒位於可執行執行緒池中,變得可執行,等待獲取cpu的使用權 執行 running 就緒狀態的執行緒或者cpu 的使用權,執行程式 阻塞 blocked 阻塞狀態是執行緒因為某...