ACE_Reactor执行逻辑
(1)ACE_Reactor反应器作为全局基础服务,提供了事件回调的统一管理。
(2)一般在处理类的构造函数里注册一个事件到反应器,或者由其他的模式显示调用反应器的注册函数来注册事件。
(3)一旦事件被注册到反应器,就意味着反应器拥有指向处理器的指针
(4)当事件发生时,反应器可以知道当前事件应该回调哪一个处理器
(5)当事件发生时,不同的事件会回调处理器的不同的handle_*方法
(6)执行handle_*的时候如果返回了-1,则会自动执行处理器的handle_close;处理器的remove_handler在被调用的时候也会执行handle_close
(7)handle_close在基类ACE_Event_Handler中的实现是什么也不做,仅仅是返回-1
ACE_Reacotr对处理器的释放
能够把堆对象交给ACE_Reactor,就说明对象已经经过了正常的创建和初始化。如果在创建和初始化阶段遇到了问题需要释放,那就是其他模式的职责,不归ACE_Reactor管。参考Acceptor-Connector模式对象的释放。
对于ACE_Reacotor反应器来说,处理器对象的释放都是通过执行处理器的handle_close方法来实现的(其他的模式可能会有自己的释放方式,这里不做讨论)
由于处理器自己的handle_close方法可能使用了父类的,也可能自己重写了。所以要分类讨论:
(1)如果服务处理器直接继承自ACE_Event_Handler,这个是不会释放处理器堆对象的,因为它的实现仅仅是返回-1就完事了
int ACE_Event_Handler::handle_input (ACE_HANDLE) { ACE_TRACE ("ACE_Event_Handler::handle_input"); return -1; }
(2)服务处理器继承自ACE_Svc_Handler(推荐),这个类自己重写了handle_close方法,主要动作就是执行自己的destroy方法,而这个方法的动作就是delete this
template <typename PEER_STREAM,typename SYNCH_TRAITS> int ACE_Svc_Handler<PEER_STREAM,SYNCH_TRAITS>::handle_close (ACE_HANDLE,ACE_Reactor_Mask) { ACE_TRACE ("ACE_Svc_Handler<PEER_STREAM,SYNCH_TRAITS>::handle_close"); if (this->reference_counting_policy ().value () == ACE_Event_Handler::Reference_Counting_Policy::DISABLED) { this->destroy (); } return 0; }
handle_timeout
handle_signal
handle_input
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。