ACE_Reactor系列

CalmReason發表於2016-03-01

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

ACE定時器

ACE_Reactor實現計時器

handle_signal

ACE_Reactor實現執行時接收鍵盤輸入

handle_input

相關文章