ACE_Module_Base子產品隻定義

class ACE_Export ACE_Module_Base { public: enum { /// Indicates that <close> should not delete any Tasks. 訓示<close>不要删除任何隊列 M_DELETE_NONE = 0, /// Indicates that <close> should delete the writer Task. 訓示<close>删除寫任務 M_DELETE_READER = 1, /// Indicates that <close> should delete the reader Task. 訓示<close>删除讀任務 M_DELETE_WRITER = 2, /// Indicates that <close> deletes the Tasks. 訓示<close>删除任務 M_DELETE = 3 }; }; ACE_Module
ACE_Module 是基于System V流的概念,它包括一對任務,一個是處理upstream,一個是處理downstream,一般而言你需要子類化該類,除非你子類化ACE_Task.簡單一點的說ACE_Module它提供了對一對任務(讀和寫)的管理進階封裝,友善流讀寫任務的指針出入和關閉處理,因為它代表在流的棧的某層的子產品,下面就會說道流ACE_Stream的這個對象。 template <ACE_SYNCH_DECL> class ACE_Module : public ACE_Module_Base { 以子產品名字<module_name>作為辨別讀<reader>寫<writer>任務建立和初始化。初始化預設讀寫任務為空。 ACE_Module (const ACE_TCHAR *module_name, ACE_Task<ACE_SYNCH_USE> *writer = 0, ACE_Task<ACE_SYNCH_USE> *reader = 0, void *args = 0, int flags = M_DELETE); 與構造函數類似,以子產品名字<module_name>作為辨別讀<reader>寫<writer>任務建立和初始化。初始化預設讀寫任務為空。根據辨別flags_參數注冊讀寫,關閉,删除,不能在<ACE_Task::module_closed>調用 int open (const ACE_TCHAR *module_name, ACE_Task<ACE_SYNCH_USE> *writer = 0, ACE_Task<ACE_SYNCH_USE> *reader = 0, void *a = 0, int flags = M_DELETE); 關閉子產品和任務,标記flags參數可以使用覆寫預設的行為,那取決以前面的<open>,<reader>,<writer>的<flag>的值。先前的M_DELETE[_XXX]不能被覆寫,不能在<ACE_Task::module_closed>調用 int close (int flags = M_DELETE_NONE); ACE_Task處理例程,得到寫任務。 ACE_Task<ACE_SYNCH_USE> *writer (void); 設定寫任務。<flags>可以使用來指定子產品可以通過調用關閉或析構來删除的寫任務。先前的任務如果存在,它會關閉。寫任務是否可以删除取決參數flags。不能在<ACE_Task::module_closed>調用 void writer (ACE_Task<ACE_SYNCH_USE> *q, int flags = M_DELETE_WRITER); 得到讀任務 ACE_Task<ACE_SYNCH_USE> *reader (void); void reader (ACE_Task<ACE_SYNCH_USE> *q, int flags = M_DELETE_READER); 在<ACE_Module>設定和擷取兄弟任務 /// Set and get pointer to sibling <ACE_Task> in an <ACE_Module> ACE_Task<ACE_SYNCH_USE> *sibling (ACE_Task<ACE_SYNCH_USE> *orig); 得到子產品辨別名字 const ACE_TCHAR *name (void) const; 設定子產品辨別名稱 void name (const ACE_TCHAR *); 擷取傳入任務的參數 void *arg (void) const; 設定傳入任務的參數 void arg (void *); 連接配接其他上遊的棧的子產品 void link (ACE_Module<ACE_SYNCH_USE> *m); 擷取流中子產品指針 ACE_Module<ACE_SYNCH_USE> *next (void); 擷取流中子產品指針 void next (ACE_Module<ACE_SYNCH_USE> *m); 動态配置設定hooks ACE_ALLOC_HOOK_DECLARE; private: 讀寫任務關閉操作 int close_i (int which, int flags); 一對讀寫任務指針 ACE_Task<ACE_SYNCH_USE> *q_pair_[2]; ACE_Module.名字 ACE_TCHAR name_[MAXNAMLEN + 1]; 棧中的下一個ACE_Module ACE_Module<ACE_SYNCH_USE> *next_; void *arg_; 任務如何删除關閉的标記 int flags_; }; } ACE_Stream主要是ASX抽象類,模型來自System V流。它包含一個<ACE_Modules>棧,每個又包含一對讀寫任務對。該類主要是對流頭和尾ACE_Module子產品的連結清單棧的方式處理和維護。流在多協定棧的消息塊處理(put,get)提供很友善的管理。 ACE_Stream流棧 put/get(ACE_Message_Block)
template <ACE_SYNCH_DECL> class ACE_Stream { virtual int open (void *arg, ACE_Module<ACE_SYNCH_USE> *head = 0, ACE_Module<ACE_SYNCH_USE> *tail = 0); virtual int close (int flags = M_DELETE); virtual ~ACE_Stream (void); virtual int push (ACE_Module<ACE_SYNCH_USE> *mod); virtual int pop (int flags = M_DELETE); virtual int top (ACE_Module<ACE_SYNCH_USE> *&mod); virtual int insert (const ACE_TCHAR *prev_name, ACE_Module<ACE_SYNCH_USE> *mod); virtual int replace (const ACE_TCHAR *replace_name, ACE_Module<ACE_SYNCH_USE> *mod, int flags = M_DELETE); virtual int remove (const ACE_TCHAR *mod, int flags = M_DELETE); virtual ACE_Module<ACE_SYNCH_USE> *head (void); virtual ACE_Module<ACE_SYNCH_USE> *tail (void); virtual ACE_Module<ACE_SYNCH_USE> *find (const ACE_TCHAR *mod); virtual int link (ACE_Stream<ACE_SYNCH_USE> &); virtual int unlink (void); virtual int put (ACE_Message_Block *mb, ACE_Time_Value *timeout = 0); */ virtual int get (ACE_Message_Block *&mb, ACE_Time_Value *timeout = 0); 指向流的頭指針 ACE_Module<ACE_SYNCH_USE> * stream_head_; 指向流尾的指針 ACE_Module<ACE_SYNCH_USE> * stream_tail_; /// Pointer to an adjoining linked stream. ACE_Stream<ACE_SYNCH_USE> * linked_us_; }
流子產品 ustream流頭 ACE_Stream_Head,ustream.流尾 ACE_Stream_Tail, ACE_Thru_Task提供流層任務處理基層類,在實際的運用中,繼承這些類并在svc()實作流資料的處理。 template <ACE_SYNCH_DECL> class ACE_Stream_Head : public ACE_Task<ACE_SYNCH_USE> { public: virtual int open (void *a = 0); virtual int close (u_long flags = 0); virtual int put (ACE_Message_Block *msg, ACE_Time_Value * = 0); virtual int svc (void); virtual int init (int argc, ACE_TCHAR *argv[]); virtual int info (ACE_TCHAR **info_string, size_t length) const; virtual int fini (void); private: /// Performs canonical flushing at the ACE_Stream Head. int control (ACE_Message_Block *); int canonical_flush (ACE_Message_Block *); }; ustream.流尾 template <ACE_SYNCH_DECL> class ACE_Stream_Tail : public ACE_Task<ACE_SYNCH_USE> { virtual int open (void *a = 0); virtual int close (u_long flags = 0); virtual int put (ACE_Message_Block *msg, ACE_Time_Value * = 0); virtual int svc (void); virtual int init (int argc, ACE_TCHAR *argv[]); virtual int info (ACE_TCHAR **info_string, size_t length) const; virtual int fini (void); } template <ACE_SYNCH_DECL> class ACE_Thru_Task : public ACE_Task<ACE_SYNCH_USE> { virtual int open (void *a = 0); virtual int close (u_long flags = 0); virtual int put (ACE_Message_Block *msg, ACE_Time_Value * = 0); virtual int svc (void); virtual int init (int argc, ACE_TCHAR *argv[]); virtual int info (ACE_TCHAR **info_string, size_t length) const; virtual int fini (void); } 這裡可以看到svc函數是個空函數,運用的時候實作這個函數 template <ACE_SYNCH_DECL> int ACE_Thru_Task<ACE_SYNCH_USE>::svc (void) { ACE_TRACE ("ACE_Thru_Task<ACE_SYNCH_USE>::svc"); return -1; } 結合ACE0015例子 首先看看對象 class Handler : public ACE_Svc_Handler 客戶對象 class Protocol_Stream 協定流對象 class Recv : public Protocol_Task 接收任務 class Xmit : public Protocol_Task 發送任務 class Protocol_Task : public ACE_Task<ACE_MT_SYNCH> 他們的關系如下: Recv和Xmit都是繼承任務類ACE_Task,分别是ACE_SOCK_Stream上接收客戶請求和發送客戶資料的封裝線程類(ACE_Task又是任務也是線程類)。他們剛好是ACE_SOCK_Stream的一對讀寫任務類,構成一個ACE_Module執行個體,然後将ACE_Module執行個體push(ACE_Module*)壓入ACE_Stream中.這樣我們使用的協定流的對象變得非常簡潔,隻需要通ACE_Stream的put,get函數通路消息資料 ACE_Svc_Handler
put /get(ACE_Message_Block *&message),