天天看点

ACE_Module_Base类

  ACE_Module_Base模块只定义  

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_Base类

  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)

ACE_Module_Base类

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_; }      

ACE_Module_Base类

      流模块   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

ACE_Module_Base类

put /get(ACE_Message_Block *&message),