精品文档---下载后可任意编辑DarwinStreamServer 是苹果公司开发的流媒体视频服务器。我们分析的代码基于版本。一、DSS 启动、初始化流程我们从 Server.tproj/main.cpp 入手,分析 DSS 加载 module 及和 module 交互的流程。(1)、DSS 在 fork 子进程后调用(2)、select_startevents 函数initialize the select() implementation of the event queue.(3)、QTSServer::Initialize 函数继续调用 QTSSModule、QTSServerPres、QTSSMessages、RTSPRequestInterface、 RTSPSessionInterface、RTPSessionInterface、RTPStream、RTSPSession、QTSSFile、QTSSUserProfile 等类的 Initialize 函数,进行 dictionary 的初始化。加载了第一个模块 QTSSErrorLogModule。this->()// set default IP addr& DNS name// begin listening,注意这里传的是 false 参数。this->(,fSrvrPrefs,inPortOverride)(4)、TaskThreadPool::AddThreads(numThreads)// numThreads 为 1到这里,第一个线程创建、运行、被添加到线程池里。在 startBroadcastRTSPSession 函数里,又调用 AddThreads 函数在线程池里添加了一个线程。(5)、TimeoutTask::Initialize()Start up the server's global tasks, and start listening. The timeoutTask mechanism is task based, we therefore must do this after adding task threads. This be done before startingthe sockets and server tasks.sThread = NEW TimeoutTaskThread();sThread->signal(Task::kStartEvent);创建一个 TimeoutTaskThread 类对象,实际上这个类的名字容易产生混淆,它并不是一个线程类,而是一个基于Task 类的任务类。因为前面已经在线程池里添加了一个任务线程,所以在这里调用 signal 的时候,就会找到这个线程,并把事件加入到这个线程的任务队列里,等待被处理。(这时,刚才创建的线程应该也在TaskThread::Entry 函数里等待事件的发生)(6)、IdleTask::Initialize()// 创建并启动空闲任务线程sIdleThread = NEW IdleTaskThread();sIdleThread->Start();(7)、Socket::StartThread()// 启动 Socket 类的 sEventThread 类所对应的线程。sEventThread 类在 Socket::Initialize 函数里创建// 到目前为止,这已是第三个启动的线程,分别是任务线程、空闲任务线程、事务线程。(8)、OSThread::Sleep...