简介
ACE_Reactor_Notify作为Reactor的实现类ACE_Reactor_Impl内部通知来唤醒eventloop
抽象
<<abstract>> ACE_Reactor_Notify +int open(ACE_Reactor_Impl *,ACE_Timer_Queue *timer_queue = 0,int disable_notify = 0) +int close(void) +nt notify(ACE_Event_Handler *eh = 0,ACE_Reactor_Mask mask = ACE_Event_Handler::EXCEPT_MASK,ACE_Time_Value *timeout = 0) +int dispatch_notifications(int &number_of_active_handles,ACE_Handle_Set &rd_mask) +ACE_HANDLE notify_handle(void) +int is_dispatchable(ACE_Notification_Buffer &buffer) +int dispatch_notify(ACE_Notification_Buffer &buffer) +int read_notify_pipe(ACE_HANDLE handle,ACE_Notification_Buffer &buffer) +void max_notify_iterations(int) +int max_notify_iterations(void) +int purge_pending_notifications(ACE_Event_Handler * = 0,ACE_Reactor_Mask = ACE_Event_Handler::ALL_EVENTS_MASK) ACE_Notification_Buffer - ACE_Event_Handler *eh_ - ACE_Reactor_Mask mask_ ACE_Event_Handler
ACE_Notification_Buffer
:作为缓存,连接调用线程和reactor线程
实现
不同的io复用机制有不同的实现
ACE_Reactor_Notify ACE_Dev_Poll_Reactor_Notify ACE_Select_Reactor_Notify ACE_WFMO_Reactor_Notify
ACE_Dev_Poll_Reactor_Notify
:是epoll和devpoll的实现
ACE_Select_Reactor_Notify
:是select的实现
ACE_WFMO_Reactor_Notify
:是windows平台wfmo的实现
ACE_Dev_Poll_Reactor_Notify
ACE_Dev_Poll_Reactor_Notify # ACE_Dev_Poll_Reactor *dp_reactor_ # ACE_Pipe notification_pipe_ # int max_notify_iterations_ # ACE_Notification_Queue notification_queue_
open
:
- 赋值dp_reactor_
- 开启管道notification_pipe_,并且设置管道读写端的属性close-on-exec
- 开启通道队列notification_queue_,预分配内存,设置管道的读写端属性非阻塞
close
:
- 管道notification_pipe_预分配内存的释放
- 管道关闭
notify
:对于开启了队列的通过事件处理器以及事件类型构造ACE_Notification_Buffer
添加到管道队列中,向管道写端写入数据唤醒读端,没有开启队列的直接向管道写端写入数据
dispatch_notifications
:不做任何操作
notify_handle
:管道的读端句柄
is_dispatchable
:不做任何操作
dispatch_notify
:根据ACE_Notification_Buffer
的事件类型调用handler的指定方法
read_notify_pipe
:对于开启了队列,从队列中取出ACE_Notification_Buffer
,如果队列中还有,则向写端写入数据唤醒读端;对于 没有开启队列,直接从管道读取
purge_pending_notifications
:对于开启管道队列的,清空管道队列中未处理的数据
ACE_Select_Reactor_Notify
ACE_Select_Reactor_Notify # ACE_Select_Reactor_Impl *select_reactor_ # ACE_Pipe notification_pipe_ # int max_notify_iterations_ # ACE_Notification_Queue notification_queue_
数据成员与ACE_Dev_Poll_Reactor_Notify类似,方法说明就不细说
open
:差异将管道读端句柄添加到select_reactor_
中,而ACE_Dev_Poll_Reactor_Notify是在ACE_Dev_Poll_Reactor
的open
时添加到reactor中
dispatch_notifications
:如果rd_mask
句柄集中包含管道的句柄,则事件数减小,清除句柄集中管道句柄,调用handle_input
dispatch_notify
:对于开启了队列的,从队列中取出数据,如果队列中还有数据,则向写端写数据唤醒读端
is_dispatchable
:检查ACE_Notification_Buffer是否有事件处理器
ACE_WFMO_Reactor_Notify
ACE_WFMO_Reactor_Notify - ACE_Timer_Queue *timer_queue_ - ACE_Auto_Event wakeup_one_thread_ - ACE_Message_Queue<ACE_MT_SYNCH> message_queue_ - int max_notify_iterations_ -int handle_signal(int signum, siginfo_t * = 0, ucontext_t * = 0)
open
:注册到wfmo_reactor
dispatch_notifications
:不做任何操作
get_handle
:wakeup_one_thread_
的句柄
dispatch_notify
:不做任何操作
read_notify_pipe
:不做任何操作
notify
:向message_queue_
队列中添加数据,使用wakeup_one_thread_
唤醒
handle_signal
:从队列中取出事件作处理