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

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

FS SIP呼叫的消息线程和状态机线程的更多相关文章

  1. 带鉴权信息的SIP呼叫

    带鉴权信息的SIP呼叫 INVITE sip:1000@192.168.50.34SIP/2.0 Via: SIP/2.0/UDP192.168.50.32:2445;branch=z9hG4bK-d ...

  2. windows平台发消息到非UI线程.

    下面的代码是介绍如何在windows平台发消息到非UI线程. 主要是'PeekMessage || GetMessage' 这两个API的应用. 当他们被调用的时候,如果当前线程还没有消息循环,就会创 ...

  3. (转)利用CAS算法实现通用线程安全状态机

    在多线程环境下,如果某个类是有状态的,那我们在使用前,需要保证所有该类的实例对象状态一致,否则会出现意向不到的bug.下面是通用线程安全状态机的实现方法. public class ThreadSav ...

  4. Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)

    keyword:Android 使用handler实现线程间发送消息 (主线程 与 子线程之间).(子线程 与 子线程之间) 相信大家平时都有使用到异步线程往主线程(UI线程)发送消息的情况. 本文主 ...

  5. SIP呼叫流程典型流程图解及其详细解释

    目录(?)[+]   1.注册流程: 2.注销流程: 3. 基本呼叫建立过程: 4. 会话更改流程: 5. 正常呼叫释放过程: 6. 被叫忙呼叫释放: 7.被叫无应答流程一: 8.被叫无应答流程二: ...

  6. Qt QThread两种方式的使用:1-继承QThread重写run函数; 2- 继承QObject并moveToThread && 消息和槽在线程和依附线程间的传递

    2019年08月18日起笔 方式一:继承QThread重写run函数 MyThread.h ----------------------------------- ... class MyThread ...

  7. Windows 消息以及消息处理算法--线程和消息队列详解

    Windows以消息驱动的方式,使得线程能够通过处理消息来响应外界. Windows 为每个需要接受消息和处理消息的线程建立消息队列(包括发送消息队列,登记消息队列,输入消息队列,响应消息队列),其中 ...

  8. Thrift线程和状态机分析

    目录 目录 1 1. 工作线程和IO线程 1 2. TNonblockingServer::TConnection::transition() 2 3. RPC函数被调用过程 3 4. 管道和任务队列 ...

  9. C# 多线程详解 Part.02(UI 线程和子线程的互动、ProgressBar 的异步调用)

           我们先来看一段运行时会抛出 InvalidOperationException 异常的代码段: private void btnThreadA_Click(object sender, ...

随机推荐

  1. Delphi 中TWebBrowser的扩展控件TExWebBrowser

    主要扩展了3D界面.右键菜单.是否显示图片.是否支持JAVA等功能. 代码如下: unit ExtWebBrowser; interface uses Windows, SysUtils, Class ...

  2. [Android]Volley源代码分析(店)应用

    通过前面的谈话,我相信你有Volley有了一定的了解了原理.本章将给出一些我们的应用程序都可以在样品中直接使用,第一样品是 NetworkImageView类,事实上NetworkImageView顾 ...

  3. 例3.1 猜猜数据结构 UVa11995

    1.标题叙述性说明:点击打开链接 2.解题思路:据来推測一种可能的数据结构,备选答案有"栈,队列.优先队列".结果也可能都不是或者不确定. STL中已经有这三种数据结构了,因此直接 ...

  4. 开发自己PHP MVC框架(一)

    本教程翻译自John Squibb 的Build a PHP MVC Framework in an Hour,但有所改动,原文地址:http://johnsquibb.com/tutorials 这 ...

  5. MySQL错误:You are using safe update mode and you tried to update a table without a WHERE that uses a K

    转载自:http://blog.csdn.net/dragonpeng2008/article/details/7279590 Error: 1175 SQLSTATE: HY000 (ER_UPDA ...

  6. HDU 3613 Best Reward 正反两次扩展KMP

    题目来源:HDU 3613 Best Reward 题意:每一个字母相应一个权值 将给你的字符串分成两部分 假设一部分是回文 这部分的值就是每一个字母的权值之和 求一种分法使得2部分的和最大 思路:考 ...

  7. Android actionbar 搜索框

    就是实如今顶部这种搜索框. 一.这个搜索框是actionbar上的menu上的一个item.叫SearchView.我们能够先在menu选项里定义好: bmap_menu.xml: <?xml ...

  8. Codeforces Round #246 (Div. 2) —B. Football Kit

    B. Football Kit time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  9. [置顶] ※数据结构※→☆线性表结构(stack)☆============栈 序列表结构(stack sequence)(六)

    栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线性表.栈是一种数据结构,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据.栈 ...

  10. hdu2955(变形01背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2955 分析:被抓概率可以转换成安全概率,Roy的安全概率大于1-P时都是安全的. 抢劫的金额为0时,肯 ...