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 重新调度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值