首页 > 代码库 > 调试C++NPv2_Reactor_Log_Server程序

调试C++NPv2_Reactor_Log_Server程序

       调试C++NPv2_Reactor_Log_Server程序,main函数中会创建一个ACE_Reactor对象,在其构造函数中将其成员变量ACE_Reactor_Impl *implementation_;赋值为ACE_WFMO_Reactor对象,所以需要构造ACE_WFMO_Reactor对象。

       ACE_WFMO_Reactor构造函数中会调用其成员函数open,在该函数中先初始化成员变量notify_handler_为ACE_WFMO_Reactor_Notify对象,然后调用ACE_WFMO_Reactor_Notify::open函数,最后会调用ACE_WFMO_Reactor::register_handler函数进而调用ACE_WFMO_Reactor_Handler_Repository::bind_i函数,将ACE_WFMO_Reactor_Notify对象ACE_Reactor_Notify *notify_handler_;保存在ACE_WFMO_Reactor_Handler_Repository类的To_Be_Added_Info *to_be_added_info_;成员变量中 。

       ACE_WFMO_Reactor_Handler_Repository::bind_i函数的最后会调用ACE_WFMO_Reactor::wakeup_all_threads函数,该函数将其成员变量ACE_Manual_Event wakeup_all_threads_;置为有信号状态。

同样调用ACE_WFMO_Reactor::register_handler函数注册ACE_Manual_Event wakeup_all_threads_;事件。然后在ACE_WFMO_Reactor::open函数的最后根据注释"Since we have added two handles into the handler repository,update the <handler_repository_>"更新了ACE_WFMO_Reactor_Handler_Repository handler_rep_;在这类主要是将前面添加到to_be_added_info_的两项赋值到current_info_中,然后ACE_WFMO_Reactor::open中将其成员变量wakeup_all_threads_重置。 

       main函数中在创建Server_Logging_Daemon对象时,会调用examples\C++NPv2\Logging_Acceptor.cpp文件中的Logging_Acceptor::open函数,Logging_Acceptor类继承自ACE_Event_Handler类,该函数中调用ACE_Reactor::register_handler函数进而调用ACE_WFMO_Reactor::register_handler函数,同样会调用ACE_WFMO_Reactor::register_handler_i函数并调用ACE_WFMO_Reactor_Handler_Repository::bind_i,将ACE_Event_Handler即其子类Logging_Acceptor添加到ACE_WFMO_Reactor_Handler_Repository类的handles_to_be_added_成员变量中,然后调用ACE_WFMO_Reactor::wakeup_all_threads即将ACE_WFMO_Reactor的成员变量ACE_Manual_Event wakeup_all_threads_;置为有信号状态。

       main函数中调用ACE_Reactor::run_reactor_event_loop,该函数中调用ACE_WFMO_Reactor::handle_events函数进而调用ACE_WFMO_Reactor::event_handling函数,该函数中调用ACE_WFMO_Reactor::wait_for_multiple_events函数,WaitForMultipleObjects等待ACE_WFMO_Reactor::open中添加的两个ACE_HANDLE,其中第一个为ACE_WFMO_Reactor_Notify::get_handle返回的成员变量ACE_Auto_Event wakeup_one_thread_;初始化为无信号状态,第二个为ACE_Manual_Event wakeup_all_threads_;的句柄,由于在Logging_Acceptor::open函数中会调用到ACE_WFMO_Reactor_Handler_Repository::bind_i并将ACE_WFMO_Reactor的成员变量ACE_Manual_Event wakeup_all_threads_;置为有信号状态。所以这里会返回1。 

       然后在ACE_WFMO_Reactor::event_handling函数中调用ACE_WFMO_Reactor::safe_dispatch,该函数首先调用ACE_WFMO_Reactor::dispatch,然后由于__try、__finally机制调用ACE_WFMO_Reactor::update_state。 

       ACE_WFMO_Reactor::dispatch函数调用ACE_WFMO_Reactor::dispatch_handles函数,该函数中循环调用ACE_WFMO_Reactor::dispatch_handler,进而调用ACE_WFMO_Reactor::simple_dispatch_handler,该函数中调用虚函数ACE_Event_Handler::handle_signal,由于多态这里调用的是ACE_Wakeup_All_Threads_Handler::handle_signal函数不做任何处理。

       ACE_WFMO_Reactor::update_state函数中对ACE_Process_Mutex lock_;变量使用ACE_GUARD_RETURN宏锁定,lock_成员变量的定义处有两点注释,一个是不用ACE_Thread_Mutex是因为其实现为临界区,临界区不用于::WaitForMultipleObjects函数,另一个是并不是一个进程互斥量,因为没有名字而且其他进程也不能用到这个变量。ACE_WFMO_Reactor::update_state函数中主要是对ACE_WFMO_Reactor_Handler_Repository handler_rep_;进行更新,因为之前Logging_Acceptor::open函数添加了继承自ACE_Event_Handler类的Logging_Acceptor,将其从ACE_WFMO_Reactor_Handler_Repository的to_be_added_info_中更新到current_info_中。然后重置ACE_WFMO_Reactor的ACE_Manual_Event wakeup_all_threads_;成员变量。这样当下一次调用ACE_WFMO_Reactor::event_handling时就会阻塞到ACE_WFMO_Reactor::wait_for_multiple_events函数的WaitForMultipleObjectsEx,此处将等待ACE_WFMO_Reactor::open中添加的两个ACE_HANDLE以及监听套接字关联的ACE_HANDLE。

调试C++NPv2_Reactor_Log_Server程序