如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
DarwinStreamServer是苹果公司开发的流媒体视频服务器。我们分析的代码基于版本。一、DSS启动、初始化流程我们从Server.tproj/main.cpp入手,分析DSS加载module及和module交互的流程。(1)、DSS在fork子进程后调用HYPERLINK"http://localhost/lxr/http/ident?v=DarwinStreamingSrvr5.5.5-Source;i=StartServer"(2)、select_startevents函数initializetheselect()implementationoftheeventqueue.(3)、QTSServer::Initialize函数继续调用QTSSModule、QTSServerPres、QTSSMessages、RTSPRequestInterface、RTSPSessionInterface、RTPSessionInterface、RTPStream、RTSPSession、QTSSFile、QTSSUserProfile等类的Initialize函数,进行dictionary的初始化。加载了第一个模块QTSSErrorLogModule。this->()//setdefaultIPaddr&DNSname//beginlistening,注意这里传的是false参数。this->(,fSrvrPrefs,inPortOverride)(4)、TaskThreadPool::AddThreads(numThreads)//numThreads为1到这里,第一个线程创建、运行、被添加到线程池里。在startBroadcastRTSPSession函数里,又调用AddThreads函数在线程池里添加了一个线程。(5)、TimeoutTask::Initialize()Startuptheserver'sglobaltasks,andstartlistening.ThetimeoutTaskmechanismistaskbased,wethereforemustdothisafteraddingtaskthreads.Thisbedonebeforestartingthesocketsandservertasks.sThread=NEWTimeoutTaskThread();sThread->signal(Task::kStartEvent);创建一个TimeoutTaskThread类对象,实际上这个类的名字容易产生混淆,它并不是一个线程类,而是一个基于Task类的任务类。因为前面已经在线程池里添加了一个任务线程,所以在这里调用signal的时候,就会找到这个线程,并把事件加入到这个线程的任务队列里,等待被处理。(这时,刚才创建的线程应该也在TaskThread::Entry函数里等待事件的发生)(6)、IdleTask::Initialize()//创建并启动空闲任务线程sIdleThread=NEWIdleTaskThread();sIdleThread->Start();(7)、Socket::StartThread()//启动Socket类的sEventThread类所对应的线程。sEventThread类在Socket::Initialize函数里创建//到目前为止,这已是第三个启动的线程,分别是任务线程、空闲任务线程、事务线程。(8)、OSThread::Sleep(1000)这里的Sleep是调用usleep来实现,为什么这里要睡眠1s???是为了等待线程的启动???(9)、sServer->InitModules(inInitialState)初始化并加载一些模块。共加载了QTSSHomeDirectoryModule、QTSSRefMovieModule、QTSSFileModule、QTSSReflectorModule、QTSSRelayModule、QTSSAccessLogModule、QTSSFlowControlModule、QTSSPosixFileSysModule、QTSSAdminModule、QTSSMP3StreamingModule、QTSSAccessModule这些模块。fSrvrPrefs=(,);......fSrvrM7essages=();::(fSrvrMessages,this,::GetErrorLogStream());......AddRereadPreferencesSe