天天看點

ACE_Reactor的各種handle_*挂鈎方法傳回值意義和設計原則(轉)

具體事件處理器定義的各種 handle_ * 挂鈎方法的傳回值緻使 ACE_Reactor 以不同的方式工作。

0 : handle_ * 方法傳回零( 0 )通知 ACE_Reactor 、事件處理器希望繼續像前面一樣被處理,也就是,它應該保持在 ACE_Reactor 的實作的一張表中。這樣,當下一次 ACE_Reactor 的事件多路分離器系統調用經由 handle_events 被調用時,它還會繼續包括該事件處理器的句柄。對于那些生存期超出一次 handle_ * 方法分派的事件處理器,這是一種“正常的”行為。

 

> 0 : handle_ * 方法傳回大于0(> 0 )的值通知 ACE_Reactor 、事件處理器希望在 ACE_Reactor 阻塞在它的事件多路分離器系統調用上面之前,再一次被分派。對協作的事件處理器來說,這種特性有助于增強全面的系統“公正性”。特别地,這種特性使得一個事件處理器在再次持有控制之前,允許其他事件處理器被分派。

 

< 0 : handle_ * 方法傳回小于0(< 0 )的值通知 ACE_Reactor 、事件處理器想要被關閉、并從 ACE_Reactor 的内部表中移除。為完成此工作、 ACE_Reactor 調用事件處理器的 handle_close 清掃方法。該方法可以執行使用者定義的終止活動,比如删除對象配置設定的動态記憶體或關閉日志檔案。 handle_close 方法傳回後, ACE_Reactor 将相關聯的具體事件處理器從它的内部表中移除。

在實作具體事件處理器時,遵守下面的設計準則:

設計準則 0 :不要手工删除事件處理器對象或顯式調用 handle_close ,相反,確定 ACE_Reactor 自動調用 handle_close 清掃方法。因而,應用必須遵從适當的協定來移除事件處理器,也就是,或者通過( 1 )從 handle_ * 挂鈎方法中傳回負值,或者通過( 2 )調用 remove_handler 。

該設計準則確定 ACE_Reactor 能夠适當地清掃它的内部表。如果不服從這一準則,當 ACE_Reactor 試圖移除已經在外部被删除的具體事件處理器時,就會帶來不可預測的記憶體管理問題。後面的設計準則詳細說明怎樣確定 ACE_Reactor 調用 handle_close 清掃方法。

設計準則1:      從繼承自ACE_Event_Handler的類的handle_* 方法中傳回的表達式必須是常量(constant)。這一設計準則有助于靜态地檢查是否handle_* 方法傳回了恰當的值。如果必須違反此準則,開發者必須在return語句之前加一注釋,解釋為何要使用變量,而不是常量。

設計準則 2 :      如果從繼承自 ACE_Event_Handler 的類的 handle_ * 方法中傳回的值不為 0 ,必須在 return 語句之前加一注釋,說明該傳回值的含義。這一設計準則確定所有非 0 的傳回值都是開發者有意使用的。

設計準則 3 :      當你想要觸發具體事件處理器的相應 handle_close 清掃方法時,從 handle_ * 方法中傳回一個負值。值- 1 通常用于觸發清掃挂鈎,因為它是 ACE_OS 系統調用包裝中一個常用的錯誤代碼。但是,任何來自 handle_ * 方法的負數都将觸發 handle_close 。

設計準則 4 :      将所有 Event_Handler 清掃活動限制在 handle_close 清掃方法中。一般而言,将所有的清掃活動合并到 handle_close 方法中,而不是分散在事件處理器的各個 handle_ * 方法中要更為容易。在處理動态配置設定的、必須用 delete this 來清除的事件處理器時,特别需要遵從此設計準則(見準則 9 )。

設計準則 5 :      不要将絕對時間用作 ACE_Reactor :: schedule_timer 的第三或第四參數。一般而言,這些參數應該小于一個極長的延遲,更遠小于目前時間。

設計準則 6 :      不要 delete 不是動态配置設定的事件處理器。任何含有 delete this 、而其類又沒有私有析構器的 handle_close 方法,都有可能違反這一設計準則。在缺乏一種能夠靜态地識别這一情況的規約檢查器時,應該在 delete this 的緊前面加上注釋,解釋為何要使用這一習語。

設計準則 7 :      總是從堆中動态配置設定具體事件處理器。這是解決許多與具體處理器的生存期有關的問題的相對直接的方法。如果不可能遵從此準則,必須在具體事件處理器登記到 ACE_Reactor 時給出注釋,解釋為什麼不使用動态配置設定。該注釋應該在将靜态配置設定的具體處理器登記到 ACE_Reactor 的 register_handler 語句的緊前面出現。

設計準則 8 :      在 ACE_Event_Handler 退出它們“生活”的作用域之前,從與它們相關聯的 ACE_Reactor 中将它們移除掉。該準則應在未遵從準則 7 的情況下使用。 

設計準則 9 :      隻允許在 handle_close 方法中使用 delete this 習語,也就是,不允許在其他 handle_ * 方法中使用 delete this 。該準則有助于檢查是否有與删除非動态配置設定的記憶體有關的潛在錯誤。自然,與 ACE_Reactor 無關的元件可以擁有不同的對自删除進行管轄的準則。

設計準則 10 :      僅在為具體事件處理器所登記的最後一個事件已從 ACE_Reactor 中移除時執行 delete this 操作。過早删除在 ACE_Reactor 上登記了多個事件的具體處理器會導緻“晃蕩的指針”。

設計準則 11 :      當你不再需要具體事件處理器的 handle_output 方法被回調時,清除 WRITE_MASK 。

設計準則 12 :      确定 get_handle 方法的特征與 ACE_Event_Handler 基類中的一緻。如果你不遵從此準則,并且你“隐式地”将 ACE_HANDLE 傳遞給 ACE_Reactor , ACE_Event_Handler 基類中的預設 get_handle 将傳回- 1 ,而這是錯誤的。

設計準則 13 :      當連接配接關閉時(或當連接配接上發生錯誤時),從 handle_ * 方法中傳回一個負值。

設計準則 14 :      在 handle_close 方法中調用 remove_handler 時,總是傳遞給它 DONT_CALL 标志。該準則確定 ACE_Reactor 不會遞歸地調用 handle_close 方法。

繼續閱讀