Focus on ACE

订阅 ace-china
电子邮件:
浏览存于 groups.google.com 上的所有帖子

C++博客 首页 新随笔 联系 聚合 管理
  64 Posts :: 3 Stories :: 22 Comments :: 0 Trackbacks

小技巧: 当ACE_Svc_Handler关闭时使用的默认行为

Stone Jiang

上一篇我们看了ACE_Svc_Handler::open()挂勾函数提供默认行为的一些技巧。因为在大多数情况下,它完成了服务创建时所需的所有事情:为输入事件注册新处理器和返回。


在ACE_Svc_Handler中关闭操作的默认行为要比在open()中初始化的代码更为复杂。这是因为关闭时的挂勾函数包含了反应式(reactive)关闭和主动式(active-object)关闭两种情

况,它们有相同的效果:删除所有在反应器注册的事件和确保删除ACE_Svc_handler的派生类的对象。

 

反应式关闭(handle_close()): 当以下形况发生时被调用:
 1) 事件回调函数(译注:handle_xxxx())返回-1时,或
 2) 调用ACE_Reactor::remove_handler(),传入的标记不含 DONT_CALL时
 反应器框架将调用handle_close()挂勾函数。 ACE_Svc_handler::handle_close()的默认行为是调用ACE_Svc_Handler::destroy()销毁事件处理器。


主动对象式关闭(close()): 当ACE_Svc_Handler 派生的对象通过activate()函数转变为主动对象,处理器的的svc()方法在它产生的线程中运行后进行回调。当svc()返回时,线程

退出,但在它要退出时,仍在将要退出线程的上下文中,ACE_Task框架调用它的close()方法。ACE_Svc_Handler::close()方法调用handle_close()完成服务处理器的清理工作。

因此,不管ACE_Svc_Handler对象是反应式还是主动式,结束时的清理工作都在相同的地方:ACE_Svc_Handler::destroy()。如果对象是动态分配且不是ACE_Stream框架中的组成部

分,destroy()将删除此对象,如果对象不是动态分配的,析构它的责任是创建时对象所在的封闭范围。如果对象是ACE_Stream的模块的组成部分,流和/或控制流的代码负责管理

对象的生命期。destroy()函数应遵守这样的规则来避免出现资源泄漏。


无论ACE_Svc_Handler对象是反应式销毁还是主动式销毁,都会引起相同的事情发生:~ACE_Svc_Handler() (处理器的析构函数)调用ACE_Svc_Handler::shutdown()函数完成服务处

理器的清理工作。shutdown()执行的这些清理操作是:

 

如果处理器与反应器是关联的:
   取消处理器关联的所有定时器。
   为处理器的流对象(如socket)删除所有已注册的事件。
如果处理器与再生器(recycler)是关系的,从再生器中清除处理器。
关闭流对象。
因此,我们看到的绝大多数情况服务处理器通过shutdown需要通过框架来清理工作,都是简单的允许缺省的挂勾函数得以被调用。如果你的应用程序需求更多的关闭/清理规则,推

荐的地方是你的处理器的handle_close()挂勾方法。仅仅是确保把ACE_Svc_Handler::destroy()函数人作为你的handle_close()的最后一个动作,与框架清理行为的余下的行为合

并。


 

posted on 2006-08-28 09:36 Stone Jiang 阅读(3106) 评论(0)  编辑 收藏 引用 所属分类: ACE

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理