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文档里面有过描述,会创建一个消息队列。

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

  • 相关阅读:
    yii源码五
    yii源码四
    yii源码三 -- db
    yii源码二 -- interfaces
    yii源码一 -- CComponent
    jquery效果 窗口弹出案例
    JS滚动条
    JS表单验证
    [TCP/IP] TCP流和UDP数据报之间的区别
    [TCP/IP] 关闭连接后为什么客户端最后还要等待2MSL
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3174362.html
Copyright © 2011-2022 走看看