zoukankan      html  css  js  c++  java
  • FS SIP呼叫的消息线程和状态机线程

    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、根据状态机的状态执行applicationcore设置的对应的回调函数

    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的状态发生改变,进行修改时,会进行唤醒动作,把之前进入sleepsession线程唤醒。然后从新执行状态机。

    另外一个线程为消息线程,其功能为不断的从呼叫对应的消息队列里面取出消息,并进行处理,我在SESSION文档里面有过描述,会创建一个消息队列。

    消息的处理会在消息队列里面进行描述。这里不再消息讲述。

  • 相关阅读:
    weekly review 200930: Battlestar Galactica
    weekly review 200926: loss memory
    weekly review 200924: LOST
    转贴:对话守则
    weekly review 200928: Return
    推荐:继续聚焦小升初——破解奥数迷题
    Centos+Nginx部署Vue项目
    centos7安装nginx
    flaskmigrate 处理sqlite数据库报错Constraint must have a name 的解决方案
    将阿里矢量图添加到elementui
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3174362.html
Copyright © 2011-2022 走看看