TProactor源码浅析二
为了模拟Proactor,必须要提供异步操作和异步操作结果的表示方法,TProactor对这点的处理相当复杂化,而且对异步操作进行了细分,复杂化了,下面来简要描述一下。
异步操作的表示
首先是异步操作的表示,这就是TRB_Asynch_Operation基类,TProactor为不同的异步操作类型定义了不同的类,分为:
TRB_Asynch_Read_Stream类,读操作;
TRB_Asynch_Write_Stream类,写操作;
TRB_Asynch_Accept类,接受连接操作;
TRB_Asynch_Connect类,发起连接操作等;
等等。
TRB_Asynch_Operation类的几个关键成员:
TRB_Handler *handler_ 服务完成处理程序;
ACE_HANDLE handle_ 表示是哪个handle上的异步事件;
TRB_Proactor *proactor_ 表示该异步事件是在哪个proactor上;
const void * completion_key_ 用户自定义的完成键,想想Win32 IOCP的completion key;
TRB_Asynch_Operation极其派生类的声明和定义都类位于源文件:Asynch_IO.h和Asynch_IO.cpp中;
下面是异步操作的表示类层次图,继承层次相对简单。
异步操作结果的表示
对应于异步操作,还需要表示异步操作结果的类,这就是TRB_Asynch_Result类,同样的也细分为各种表示具体操作结果的类,继承自TRB_Asynch_Result类。
TRB_Asynch_Read_Stream_Result类,读操作结果;
TRB_Asynch_Write_Stream_Result类,写操作结果;
TRB_Asynch_Accept_Result类,接受连接操作结果;
TRB_Asynch_Connect_Result类,发起连接操作等结果;
等等。
TRB_Asynch_Result极其子类都位于源文件:Asynch_IO.h和Asynch_IO.cpp中;
TRB_Asynch_Result类的几个关键成员:
TRB_Handler *handler_ 服务完成处理程序;
ACE_HANDLE handle_ 表示是哪个handle上的异步事件;
它们都直接取自对应的异步操作(TRB_Asynch_Operation)对象。
异步操作结果的平台无关性封装
除了这些类,还有一批表示异步操作结果的类,在POSIX平台上,它们继承自同一个基类TRB_POSIX_Asynch_Result(对应于Win32则是TRB_Win32_Asynch_Result)。
TRB_POSIX_Asynch_Read_Stream_Result类,读操作结果;
TRB_ POSIX_Asynch_Write_Stream_Result类,写操作结果;
TRB_ POSIX_Asynch_Accept_Result类,接受连接操作结果;
TRB_ POSIX_Asynch_Connect_Result类,发起连接操作等结果;
TRB_POSIX_Asynch_Result和TRB_Win32_Asynch_Result是TRB_Asynch_Result_Impl类的子类,它的子类必须实现接口:
virtual TRB_Asynch_Result & get_original_result () = 0;来获取异步操作结果的对象;
TRB_Asynch_Result_Impl类在源文件Asynch_IO_Impl.h和Asynch_IO_Impl.cpp中声明和定义;
TRB_POSIX_Asynch_Result类及其派生类的声明和定义都位于源文件:POSIX_Asynch_IO.h和POSIX_Asynch_IO.cpp中;
相当繁琐吧,TRB_Asynch_Result系列和TRB_POSIX_Asynch_Result系列有什么关联呢?个人也感觉这种设计很混乱,下面就来简单说说。
首先:上面讲过TRB_POSIX_Asynch_Result系列通过get_original_result () = 0;来获取异步操作结果的对象;
再者:而Proactor类会导出一系列的create_result_impl()接口,从而根据TRB_Asynch_Result系列对象创建TRB_Asynch_Result_Impl系列对象;比如POSIX_Proactor类中:
virtual TRB_Asynch_Result_Impl *create_result_impl (const TRB_Asynch_Read_Stream_Result & result);
该函数根据传入的TRB_Asynch_Read_Stream_Result对象result,调用create_posix_result函数,直接创建TRB_POSIX_Asynch_Read_Stream_Result对象,看代码:
return create_posix_result<TRB_POSIX_Asynch_Read_Stream_Result>
(result,
&this->allocator11_,
this);
引入TRB_Asynch_Result_Impl的目的也是为了平台无关性的封装,最后看看这些类的层次和关系图:
至于异步操作和异步操作结果之间的联系,下节就能涉及到,暂时到此,休息时间到。