【Darwin学习笔记】之EventThread

【转载请注明出处】:http://blog.csdn.net/longlong530

EventThread负责侦听Darwin系统的Socket事件,包括以下两类, 对于两类事件是分别如何处理的,我们从头开始分析。

a)   建立新的RTSP连接请求事件

b)   已有RTSP连接上的RTSP请求消息事件

一.  EventThread 的创建

RunServer.cpp 中StartServer函数初始化调用了 Socket::Initialize(),在该函数内即创建了EventThread,但是这里仅为创建,并未启动,所以还没有进入到线程的Entry()函数

二.  EventThread 的启动

RunServer.cpp 中StartServer函数初始化调用了Socket::StartThread(),启动了在上一步创建的sEventThread类所对应的线程。

三.  EventThread 的运行

EventThread 线程启动后进入,EventThread::Entry()函数中开始调用select_waitevent函数监听所有的Socket端口,直到有事件发生为止

当有事件发生时:

//通过事件中的标识找到相应的对象参考指针
            StrPtrLen idStr((char*)&theCurrentEvent.er_data, sizeof(theCurrentEvent.er_data));
			//fRefTable中的对象参考指针RTSPListenerSocket
            OSRef* ref = fRefTable.Resolve(&idStr);
            if (ref != NULL)
            {
				//通过参考指针得到EventContext对象
                EventContext* theContext = (EventContext*)ref->GetObject();

找到对应的对象后,开始调用其处理方法,这里要着重关注ProcessEvent()方法:

ProcessEvent作为虚函数有两个实现,在这里RTSP连接和RTSP连接内的消息请求会有不同的调用分支;

EventContext类中实现了ProcessEvent方法;

EventContext的派生类TCPListenerSocket中实现了ProcessEvent方法。

a).  建立新的RTSP连接请求事件

fRefTable表插入时间: QTSServer::StartTasks()中的 fListeners[x]->RequestEvent(EV_RE);,存入的对象为RTSPListenerSocket

调用方法: TCPListenerSocket::ProcessEvent

方法描述: 此方法调用RTSPListenerSocket的GetSessionTask方法建立一个RTSPSession,并把相应的套接口加入侦听队列,等待RTSP请求。

然后还需调用this->RequestEvent(EV_RE)把建立RTSP连接的请求加入到侦听队列。

b).  已有RTSP连接上的RTSP请求消息事件

fRefTable表插入时间: 上一步的this->RequestEvent(EV_RE)

调用方法: EventContext::ProcessEvent

方法描述: 通过Task的Signal把对应的RTSPSession类型的Task加入到TaskThread::fTaskQueue中等待TaskThread处理。

//处理RTSP连接请求或者RTSP连接上的消息请求事件
theContext->ProcessEvent(theCurrentEvent.er_eventbits);
fRefTable.Release(ref);//减少引用计数

另外介绍下TCPListenerSocket::ProcessEvent方法,摘取片段进行备注说明

    //获取RTSPSession的fSocket参数,然后将当前接收数据的socket赋值给该参数;
    theTask = this->GetSessionTask(&theSocket);
    if (theTask == NULL)
    {    //this should be a disconnect. do an ioctl call?
        close(osSocket);
        if (theSocket)
            theSocket->fState &= ~kConnected; // turn off connected state
    }
    else//创建成功,接着创建Socket对象;
    {
        /*此处省略部分代码*/
        //把刚刚建立好的RTSP连接加入到侦听队列,等待RTSP请求的到来;
        theSocket->Set(osSocket, &addr);
        theSocket->InitNonBlocking(osSocket);//初始化;
	//将新建的RTSPSession保存到EventContext对应的fTask属性,当该socket连接后面的消息事件到来时即将该RTSPSession任务加入到task线程中;
        theSocket->SetTask(theTask);
        theSocket->RequestEvent(EV_RE);//新对象监听读事件;(EventContext开始监听该socket连接之上发送的消息)

	//theTask就是新建的RTSPSession;
        theTask->SetThreadPicker(Task::GetBlockingTaskThreadPicker()); //The RTSP Task processing threads

【转载请注明出处】:http://blog.csdn.net/longlong530

时间: 2024-10-13 01:57:00

【Darwin学习笔记】之EventThread的相关文章

【Darwin学习笔记】之TaskThread

[转载请注明出处]:http://blog.csdn.net/longlong530 学习TaskThread主要有三个类要关注: TaskTreadPool: 任务线程池 TaskThread:任务线程 Task: 任务 1. TaskThreadPool Darwin运行着一个或者多个任务(Task)线程,并将他们统一在线程池TaskThreadPool中管理.任务线程从事件线程中接收RTSP和RTP请求,然后把请求传递到恰当的服务器模块进行处理,把数据包发送给客户端. 缺省情况下,核心服务

【Darwin学习笔记】之RTSPSession

今天详细的看了下RTSPSession的会话处理代码,该模块主要是Run方法内对会话的状态机进行管理,实现对RTSP会话的处理,我以点播Movie文件夹下的视频文件为例,深入的学习了(Describe.Setup.Play的点播流程),并按照状态机的处理顺序对他们进行一一解析,如下: [转载请注明出处]:http://blog.csdn.net/longlong530 1. 状态机 kReadingFirstRequest 通过fInputStream.ReadRequest()调用Sessio

【Darwin学习笔记】之RTSP连接监听初始化

网上有很多大侠已经对Darwin做了详细的剖析,在下仅本着积累经验的目的,将Darwin的学习过程记录下来,同时与网友们交流学习,今天先来分析下Darwin如果根据配置文件监听RTSP连接的流程. 1. Darwin系统初始化,Bool16 QTSServer::Initialize(.....) 2. QTSServer::CreateListeners(...)根据本地xml配置文件中的地址和端口进行监听的建立,主要有两个配置项: <PREF NAME="bind_ip_addr&qu

【Darwin学习笔记】之QTSSReflectorModule的Announce消息处理

RTSP Announce命令是数据源向Darwin服务端主动发起的上报本地媒体sdp信息的命令,在Darwin中处理该命令的函数为QTSSReflectorModule模块的DoAnnounce()函数,下面对该函数的进行剖析: [转载请注明出处]:http://blog.csdn.net/longlong530 1. 判断sAnnounceEnabled是否开启,由以下配置项确定,默认为true <PREF NAME="enable_broadcast_announce" T

【Darwin学习笔记】之QTSSReflectorModule的Describe消息处理

对于QTSSReflectorModule里面的Describe消息只处理sdp类型的资源请求,其他类型的比如mov.mp4等资源会跳转到QTSSFileModule里面,其中mp4文件在Darwin源码中点播需要先hint下.如果想在增加多种视频格式那就要对FileModule进行扩展,在我们的项目中就优化了FileModule,实现了对mp4.avi等各种格式的文件的点播支持.后面的章节我们详细讨论. [转载请注明出处]:http://blog.csdn.net/longlong530 1.

【Darwin学习笔记】之QTSSReflectorModule的Setup消息处理

Setup消息进入到DoSetup函数单独处理,处理流程如下: [转载请注明出处]:http://blog.csdn.net/longlong530 1. 根据关键字qtssRTSPReqTransportMode判断是否为推模式,具体isPush值由Setup请求中的mode值有关,mode="receive" || mode="record"表示isPush为true.对应的解析函数为:void RTSPRequest::ParseModeSubHeader(S

storm学习笔记完整记录(一)

storm有两种运行模式(本地模式和集群模式) 1. 首先创建一个类似于HelloWorld的简单程序,以便进入storm的大门,包结构如下: 2.从包结构可以知道,这是一个Maven Project,pom.xml的内容如下: <project xmlns="http://maven.apache.org/POM/4.0.0"          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    

Go学习笔记(一)Let&#39;s 干

加 Golang学习 QQ群共同学习进步成家立业 ^-^ 群号:96933959 简介     Go是Google开发的一种 静态强类型.编译型,并发型,并具有垃圾回收功能的编程语言.为了方便搜索和识别,有时会将其称为Golang. 罗伯特·格瑞史莫,罗勃·派克(Rob Pike)及肯·汤普逊于2007年9月开始设计Go语言,稍后Ian Lance Taylor.Russ Cox加入项目.Go语言是基于Inferno操作系统所开发的.Go语言于2009年11月正式宣布推出,成为开放源代码项目,并

vector 学习笔记

vector 使用练习: /**************************************** * File Name: vector.cpp * Author: sky0917 * Created Time: 2014年04月27日 11:07:33 ****************************************/ #include <iostream> #include <vector> using namespace std; int main