ACE之反应堆学习(一)

 
这是ACE反应堆的动态实现过程,其设计的架构分为以上几个框图,这里我结合源代码分析一下。
(一)register_handler():
1.用户程序:ACE_Reactor::instance ()->register_handler(endpoint, ACE_Event_Handler::READ_MASK) == -1);
              参数1:handler(图中由h表示)
2.反应堆(ACE_Reactor):this->implementation ()->register_handler (event_handler, mask);
              由于ACE_Reactor_Impl类是抽象接口,我们看它其中一个具体实现子类(ACE_Select_Reactor_T)。
3.ACE_Select_Reactor_T<ACE_SELECT_REACTOR_TOKEN>:this->register_handler_i (handler->get_handle (), handler, mask);
              这里的get_handle是需要重载用户自己定义派生类中的get_handle实现函数
4.ACE_Select_Reactor_T<ACE_SELECT_REACTOR_TOKEN>:this->handler_rep_.bind (handle, event_handler, mask);
               ACE_Select_Reactor_Handler_Repository是协同合作的类
5.ACE_Select_Reactor_Handler_Repository::bind(部分代码如下)
 
 ACE_Event_Handler * const current_handler = this->event_handlers_[handle];//通过位图的方式获得注册handle对应的handler
     if (current_handler)//发现已经处在了handler,表明不能重复注册
    {
           if (current_handler != event_handler)
        return -1;
          existing_handle = true;
    }
  this->event_handlers_[handle] = event_handler;//这里使handle和handler绑定在一起了。
  if (this->max_handlep1_ < handle + 1)
    this->max_handlep1_ = handle + 1;
#endif /* ACE_WIN32 */
  if (this->select_reactor_.is_suspended_i (handle))
    {
      this->select_reactor_.bit_ops (handle,
                                     mask,
                                     this->select_reactor_.suspend_set_,
                                     ACE_Reactor::ADD_MASK);
    }
  else
    {
      this->select_reactor_.bit_ops (handle,
                                     mask,
                                     this->select_reactor_.wait_set_,
                                     ACE_Reactor::ADD_MASK);//看如下分析
     }
ACE_Select_Reactor_Impl::bit_ops如果大家熟悉linux的select函数,一看就发现这个函数其实集成了很多文件描述符集的操作函数,如:FD_IISET,FD_SET,FD_ZERO等等。和我们具体相关的代码如下:
ACE_FDS_PTMF ptmf  = &ACE_Handle_Set::set_bit;
 if (ACE_BIT_ENABLED (mask, ACE_Event_Handler::READ_MASK)
          || ACE_BIT_ENABLED (mask, ACE_Event_Handler::ACCEPT_MASK)
          || ACE_BIT_ENABLED (mask, ACE_Event_Handler::CONNECT_MASK))
        {
          (handle_set.rd_mask_.*ptmf) (handle);//上面的set_bit函数其实是FD_SET和FD_ZERO的封装,功能就是把handle加入rd_mask_描述符集中。
        }
当Handler注册完毕,进入Initiation Dispatcher的事件循环。Initiation Dispatcher 把所有Handler中的Handle组合在一起,使用Synchronous Event Demultiplexer 去等待事件的发生。
(二)handle_events():
1.用户程序:ACE_Reactor::instance ()->handle_events (tv);参数1表示用户设置的等待时间。
2.反应堆:ACE_Reactor::handle_events-------this->implementation ()->handle_events (max_wait_time);
               由于ACE_Reactor_Impl类是抽象接口,我们看它其中一个具体实现子类(ACE_Select_Reactor_T)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值