小技巧: 當(dāng)ACE_Svc_Handler關(guān)閉時(shí)使用的默認(rèn)行為
Stone Jiang
上一篇我們看了ACE_Svc_Handler::open()掛勾函數(shù)提供默認(rèn)行為的一些技巧。因?yàn)樵诖蠖鄶?shù)情況下,它完成了服務(wù)創(chuàng)建時(shí)所需的所有事情:為輸入事件注冊(cè)新處理器和返回。
在ACE_Svc_Handler中關(guān)閉操作的默認(rèn)行為要比在open()中初始化的代碼更為復(fù)雜。這是因?yàn)殛P(guān)閉時(shí)的掛勾函數(shù)包含了反應(yīng)式(reactive)關(guān)閉和主動(dòng)式(active-object)關(guān)閉兩種情
況,它們有相同的效果:刪除所有在反應(yīng)器注冊(cè)的事件和確保刪除ACE_Svc_handler的派生類的對(duì)象。
?
反應(yīng)式關(guān)閉(handle_close()): 當(dāng)以下形況發(fā)生時(shí)被調(diào)用:
?1) 事件回調(diào)函數(shù)(譯注:handle_xxxx())返回-1時(shí),或
?2) 調(diào)用ACE_Reactor::remove_handler(),傳入的標(biāo)記不含 DONT_CALL時(shí)
?反應(yīng)器框架將調(diào)用handle_close()掛勾函數(shù)。 ACE_Svc_handler::handle_close()的默認(rèn)行為是調(diào)用ACE_Svc_Handler::destroy()銷毀事件處理器。
主動(dòng)對(duì)象式關(guān)閉(close()): 當(dāng)ACE_Svc_Handler 派生的對(duì)象通過(guò)activate()函數(shù)轉(zhuǎn)變?yōu)橹鲃?dòng)對(duì)象,處理器的的svc()方法在它產(chǎn)生的線程中運(yùn)行后進(jìn)行回調(diào)。當(dāng)svc()返回時(shí),線程
退出,但在它要退出時(shí),仍在將要退出線程的上下文中,ACE_Task框架調(diào)用它的close()方法。ACE_Svc_Handler::close()方法調(diào)用handle_close()完成服務(wù)處理器的清理工作。
因此,不管ACE_Svc_Handler對(duì)象是反應(yīng)式還是主動(dòng)式,結(jié)束時(shí)的清理工作都在相同的地方:ACE_Svc_Handler::destroy()。如果對(duì)象是動(dòng)態(tài)分配且不是ACE_Stream框架中的組成部
分,destroy()將刪除此對(duì)象,如果對(duì)象不是動(dòng)態(tài)分配的,析構(gòu)它的責(zé)任是創(chuàng)建時(shí)對(duì)象所在的封閉范圍。如果對(duì)象是ACE_Stream的模塊的組成部分,流和/或控制流的代碼負(fù)責(zé)管理
對(duì)象的生命期。destroy()函數(shù)應(yīng)遵守這樣的規(guī)則來(lái)避免出現(xiàn)資源泄漏。
無(wú)論ACE_Svc_Handler對(duì)象是反應(yīng)式銷毀還是主動(dòng)式銷毀,都會(huì)引起相同的事情發(fā)生:~ACE_Svc_Handler() (處理器的析構(gòu)函數(shù))調(diào)用ACE_Svc_Handler::shutdown()函數(shù)完成服務(wù)處
理器的清理工作。shutdown()執(zhí)行的這些清理操作是:
?
如果處理器與反應(yīng)器是關(guān)聯(lián)的:
?? 取消處理器關(guān)聯(lián)的所有定時(shí)器。
?? 為處理器的流對(duì)象(如socket)刪除所有已注冊(cè)的事件。
如果處理器與再生器(recycler)是關(guān)系的,從再生器中清除處理器。
關(guān)閉流對(duì)象。
因此,我們看到的絕大多數(shù)情況服務(wù)處理器通過(guò)shutdown需要通過(guò)框架來(lái)清理工作,都是簡(jiǎn)單的允許缺省的掛勾函數(shù)得以被調(diào)用。如果你的應(yīng)用程序需求更多的關(guān)閉/清理規(guī)則,推
薦的地方是你的處理器的handle_close()掛勾方法。僅僅是確保把ACE_Svc_Handler::destroy()函數(shù)人作為你的handle_close()的最后一個(gè)動(dòng)作,與框架清理行為的余下的行為合
并。
?