ats异步案例分析
现在以do_http_server_open为例
HttpSM::do_http_server_open(bool raw)
netProcessor.connect_re(this,&t_state.current.server->addr.sa, &opt);获取状态机中的锁(this即httpSM的mutex最终源于netvc netvc的mutex源于(acceptLoopEvent中)vc中的mutex) 而源头vc中的mutex是new出来的 这就意味着 HttpSM可以被任意线程执行、访问
获取持有该mutex的线程 即t = mutex->thread_holding 还是从源头讲起 vc被封装成event放到事件系统中(线程的外部队列中) 此vc是accept后的结果 经过event_sys立即调度执行handler acceptEvent()将fd挂树上监听 再判断io事件 从而分辨出不同协议 若是http协议则在new_connection中执行了一次加锁操作 @#¥@! 应该所有函数都是在线程中执行的
这个线程很可能就是vc封装成事件后放入的那个线程
在这个线程中分配一个新的vc vc->mutex=状态机中的mutex vc->action=cont(即vc->action继承了HttpSM)
在当前线程中对mutex加锁
然后对NetHandler加锁
加锁成功则connectUp 有一个重要的操作就是挂树上 不管链接是否成功 最后调用action->continuation->handleEvent即HttpSM::main_handler 即调用了state_http_server_open(NET_EVENT_OPEN)在上层状态机,可以设置VIO,之后上层状态机就可以收到READ|WRITE_READY的事件了
加锁失败 则schedule_imm 重新调度