1。进入SP_Server的runForever函数,该函数最终转入start()函数执行
2。start函数是主要执行函数
函数内部使用了libevent.有关libevent编程参考官方主页。
函数内部涉及重要的类有:
SP_Executor(任务执行者,内部封装线程池)
L160初始化服务器监听,188-192初始化事件,194初始化任务执行者workerExecutor
这里使用了半同步、半异步模式。
event_base_loop( eventArg.getEventBase(), EVLOOP_ONCE );运行在主线程当中,借助libevent的抓取TCP异步事件。
class SP_EventCallback {
public:
static void onAccept( int fd, short events, void * arg ); //处理客户端连接事件
static void onRead( int fd, short events, void * arg ); //处理客户端读数据事件
static void onWrite( int fd, short events, void * arg ); //处理客户端写数据事件
static void onResponse( void * queueData, void * arg );
static void addEvent( SP_Session * session, short events, int fd );
...}
SP_EventCallback处理各种事件,将对应的后续处理函数入队。由任务执行者对象出队,交给线程池去执行。
class SP_EventHelper {
public:
static void doStart( SP_Session * session ); //对应onAccept事件
static void start( void * arg );
static void doError( SP_Session * session ); //对应onRead和onWrite中的错误处理流程
static void error( void * arg );
static void doTimeout( SP_Session * session ); //对应onRead和onWrite中的超时处理流程
static void timeout( void * arg );
static void doClose( SP_Session * session ); //对应onWrite的正常关闭处理流程
static void myclose( void * arg );
static void doCompletion( SP_EventArg * eventArg, SP_Message * msg ); //对应onResponse中的完成处理流程
...
}
该类当中doXXX函数最用是配合事件处理函数将XXX函数入队。XXX函数是由线程去真正地执行