青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

小明思考

高性能服務(wù)器端計(jì)算
posts - 70, comments - 428, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
1. ACE_Reactor的創(chuàng)建
ctor: ACE_Reactor (ACE_Reactor_Impl *implementation = 0, int delete_implementation = 0);
你可以自己創(chuàng)建一個ACE_Reactor
但是大多數(shù)時候,我們都是通過調(diào)用ACE_Reactor::instance()這個靜態(tài)方法來返回唯一的實(shí)例。

ACE_Reactor *
ACE_Reactor::instance (
void)
{
  ACE_TRACE (
"ACE_Reactor::instance");

  
if (ACE_Reactor::reactor_ == 0)  //1
    {
      
// Perform Double-Checked Locking Optimization.
      ACE_MT (ACE_GUARD_RETURN (ACE_Recursive_Thread_Mutex, ace_mon,
                                
*ACE_Static_Object_Lock::instance (), 0));

      
if (ACE_Reactor::reactor_ == 0) //2
        {
          ACE_NEW_RETURN (ACE_Reactor::reactor_,
                          ACE_Reactor,
                          
0);
          ACE_Reactor::delete_reactor_ 
= 1;
          ACE_REGISTER_FRAMEWORK_COMPONENT(ACE_Reactor, ACE_Reactor::reactor_)
        }
    }
  
return ACE_Reactor::reactor_;
}
注意這點(diǎn)使用了雙檢測的機(jī)制(代碼1和2),為了提高效率,不用每次都加鎖。

2. Impl手法的運(yùn)用
ACE_Reactor有個成員變量 ACE_Reactor_Impl *implementation_;
這個implementation_才是真正做事情的東西,典型的Impl手法。
為什么要多一個這個間隔層呢,主要是為了實(shí)現(xiàn)跨平臺。
因?yàn)椴煌钠脚_的Reactor差異很大。
在Windows平臺,實(shí)現(xiàn)這個是ACE_WFMO_Reactor
class ACE_Export ACE_WFMO_Reactor : public ACE_Reactor_Impl

3. Event_Handle的管理
ACE_WFMO_Reactor把要管理的Handle都放在 ACE_WFMO_Reactor_Handler_Repository handler_rep_;
這里要注意的是io_handle和event_handle的區(qū)別
io_handle是真正的handle,比如socket_handle, thread_handle
而event_handle是綁定在io_handle上面的事件handle

有代碼為證:
 1 int
 2 ACE_WFMO_Reactor::register_handler_i (ACE_HANDLE event_handle,
 3                                       ACE_HANDLE io_handle,
 4                                       ACE_Event_Handler *event_handler,
 5                                       ACE_Reactor_Mask new_masks)
 6 {
 7   // If this is a Winsock 1 system, the underlying event assignment will
 8   // not work, so don't try. Winsock 1 must use ACE_Select_Reactor for
 9   // reacting to socket activity.
10 
11   // Make sure that the <handle> is valid
12   if (io_handle == ACE_INVALID_HANDLE)
13     io_handle = event_handler->get_handle ();
14 
15   if (this->handler_rep_.invalid_handle (io_handle))
16     {
17       errno = ERROR_INVALID_HANDLE;
18       return -1;
19     }
20 
21   long new_network_events = 0;
22   int delete_event = 0;
23   auto_ptr <ACE_Auto_Event> event;
24 
25   // Look up the repository to see if the <event_handler> is already
26   // there.
27   ACE_Reactor_Mask old_masks;
28   int found = this->handler_rep_.modify_network_events_i (io_handle,
29                                                           new_masks,
30                                                           old_masks,
31                                                           new_network_events,
32                                                           event_handle,
33                                                           delete_event,
34                                                           ACE_Reactor::ADD_MASK);
35 
36   // Check to see if the user passed us a valid event; If not then we
37   // need to create one
38   if (event_handle == ACE_INVALID_HANDLE)
39     {
40       // Note: don't change this since some C++ compilers have
41       // <auto_ptr>s that don't work properly
42       auto_ptr<ACE_Auto_Event> tmp (new ACE_Auto_Event);
43       event = tmp;
44       event_handle = event->handle ();
45       delete_event = 1;
46     }
47 
48   int result = ::WSAEventSelect ((SOCKET) io_handle,
49                                  event_handle,
50                                  new_network_events);

可以看到在42行create event,在44復(fù)制到event_handle,最后通過WSAEventSelect將這個io_handle和event_handle綁定在一起了

這個register_handle調(diào)用一般都在Event_Handler的open函數(shù)中,實(shí)現(xiàn)了注冊到Reactor中去。

4. 等待事件
如何檢測到要發(fā)生的socket的事件呢?比如有新的client連接,收發(fā)。ACE并不直接調(diào)用select函數(shù)來取得。
ACE調(diào)用WaitForMultipleObjectsEx來等待事件的發(fā)生。ACE這樣做的好處是不但可以捕捉socket事件,也可以捕捉到其他事件。前面說過了每一個對應(yīng)的socket都有一個event_handle與之對應(yīng)。WaitForMultipleObjectsEx會將發(fā)生事件的socket handle的index返回。這樣ACE_Reactor就可以利用這個slot來查到io_handle和event_handler( 注意:event_handle和event_handler是不同的)

 1 DWORD
 2 ACE_WFMO_Reactor::wait_for_multiple_events (int timeout,
 3                                             int alertable)
 4 {
 5   // Wait for any of handles_ to be active, or until timeout expires.
 6   // If <alertable> is enabled allow asynchronous completion of
 7   // ReadFile and WriteFile operations.
 8 
 9   return ::WaitForMultipleObjectsEx (this->handler_rep_.max_handlep1 (),
10                                      this->handler_rep_.handles (),
11                                      FALSE,
12                                      timeout,
13                                      alertable);
14 }

5.分發(fā)事件
根據(jù)WaitForMultiObjectEx返回的slot就可以查詢到event_handler來調(diào)用用戶的處理函數(shù)了

 1 int
 2 ACE_WFMO_Reactor::complex_dispatch_handler (DWORD slot,
 3                                             ACE_HANDLE event_handle)
 4 {
 5   // This dispatch is used for I/O entires.
 6 
 7   ACE_WFMO_Reactor_Handler_Repository::Current_Info &current_info =
 8     this->handler_rep_.current_info ()[slot];
 9 
10   WSANETWORKEVENTS events;
11   ACE_Reactor_Mask problems = ACE_Event_Handler::NULL_MASK;
12   if (::WSAEnumNetworkEvents ((SOCKET) current_info.io_handle_,
13                               event_handle,
14                               &events) == SOCKET_ERROR)
15     problems = ACE_Event_Handler::ALL_EVENTS_MASK;
16   else
17     {
18       // Prepare for upcalls. Clear the bits from <events> representing
19       // events the handler is not interested in. If there are any left,
20       // do the upcall(s). upcall will replace events.lNetworkEvents
21       // with bits representing any functions that requested a repeat
22       // callback before checking handles again. In this case, continue
23       // to call back unless the handler is unregistered as a result of
24       // one of the upcalls. The way this is written, the upcalls will
25       // keep being done even if one or more upcalls reported problems.
26       // In practice this may turn out not so good, but let's see. If any
27       // problems, please notify Steve Huston <shuston@riverace.com>
28       // before or after you change this code.
29       events.lNetworkEvents &= current_info.network_events_;
30       while (events.lNetworkEvents != 0)
31         {
32           ACE_Event_Handler *event_handler =
33             current_info.event_handler_;
34 
35           int reference_counting_required =
36             event_handler->reference_counting_policy ().value () ==
37             ACE_Event_Handler::Reference_Counting_Policy::ENABLED;
38 
39           // Call add_reference() if needed.
40           if (reference_counting_required)
41             {
42               event_handler->add_reference ();
43             }
44 
45           // Upcall
46           problems |= this->upcall (current_info.event_handler_,
47                                     current_info.io_handle_,
48                                     events);
49 
50           // Call remove_reference() if needed.
51           if (reference_counting_required)
52             {
53               event_handler->remove_reference ();
54             }
55 
56           if (this->handler_rep_.scheduled_for_deletion (slot))
57             break;
58         }
59     }
60 
61   if (problems != ACE_Event_Handler::NULL_MASK
62       && !this->handler_rep_.scheduled_for_deletion (slot)  )
63     this->handler_rep_.unbind (event_handle, problems);
64 
65   return 0;
66 }

這里值得注意的是ACE通過調(diào)用WSAEnumNetworkEvents來重置event_handle。

講的比較概要,更具體的細(xì)節(jié)請自己閱讀源碼。
關(guān)于ACE_Reactor的用法請參見前一篇我的示例。


Feedback

# re: [ACE源碼分析]ACE_Reactor是如何做到事件分發(fā)的  回復(fù)  更多評論   

2006-04-13 09:18 by Stone Jiang
好文章,收藏
另外,我發(fā)現(xiàn)提高blog積分的最好辦法是多評論別人.哈哈,我進(jìn)前100了.

# re: [ACE源碼分析]ACE_Reactor是如何做到事件分發(fā)的[未登錄]  回復(fù)  更多評論   

2007-05-10 17:39 by recorder
// Perform Double-Checked Locking Optimization.

以前看代碼的時候沒注意,看你文章聽到你重點(diǎn)提了提,偶看了看DC-Locking.pdf, 有所收獲。多謝
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩在线另类| 久久精品夜夜夜夜久久| 免费观看在线综合色| 亚洲在线播放| 亚洲欧美成人网| 亚洲理论在线观看| 亚洲精品男同| 欧美刺激午夜性久久久久久久| 久久国产66| 久久手机免费观看| 亚洲经典一区| 亚洲一线二线三线久久久| 亚洲欧美精品一区| 美国成人毛片| 国产精品久久久久久久免费软件| 国产一区二区三区四区老人| 在线高清一区| 午夜精品久久99蜜桃的功能介绍| 久久亚洲不卡| 一区二区三区回区在观看免费视频| 久久久久88色偷偷免费| 亚洲毛片一区二区| 国产毛片精品视频| 国产精品欧美风情| 国产日本欧美一区二区三区| 国产日韩视频| 亚洲国产精品久久久久婷婷老年| 亚洲精品欧美极品| 亚洲网站在线观看| 久久精品视频va| 亚洲成色www8888| 久久先锋影音| 欧美亚洲视频| 老司机午夜精品| 欧美日韩中文字幕精品| 国外成人免费视频| 亚洲少妇在线| 欧美成人69| 亚洲欧美在线另类| 欧美日本精品在线| 亚洲高清在线| 久久久亚洲国产美女国产盗摄| 99在线精品视频| 久久综合久久久| 国产一区在线免费观看| 亚洲图片自拍偷拍| 亚洲国产mv| 久久精品国产亚洲5555| 国产精品美女一区二区| 亚洲五月六月| 亚洲精品一区中文| 欧美成人xxx| 在线色欧美三级视频| 欧美在线短视频| 一区二区三区高清在线| 欧美精品日韩一区| 亚洲精品久久久久久久久久久久久 | 亚洲国产国产亚洲一二三| 午夜精品一区二区三区在线播放 | 亚洲三级视频在线观看| 免费视频一区| 久久久免费精品| 久久中文字幕一区| 亚洲一区欧美二区| 国内揄拍国内精品少妇国语| 在线中文字幕不卡| 亚洲人妖在线| 欧美人与性禽动交情品 | 久久久www成人免费精品| 国产精品资源| 久久精品99国产精品酒店日本| 亚洲综合色噜噜狠狠| 国产九九精品视频| 久久精品二区| 久久青草福利网站| 亚洲高清不卡在线观看| 亚洲国产精品传媒在线观看| 欧美精品1区| 亚洲综合日本| 欧美一级精品大片| 亚洲大片av| 亚洲精品一区二区三区蜜桃久| 国产精品久久久久永久免费观看| 欧美在线播放一区二区| 久久中文字幕一区二区三区| 亚洲高清自拍| 一区二区三区视频免费在线观看| 国产视频久久| 亚洲风情亚aⅴ在线发布| 欧美人与性禽动交情品| 久久国产精品久久国产精品| 久久综合五月| 亚洲欧美日韩国产综合| 久久精品亚洲| 亚洲视频精品| 麻豆精品精品国产自在97香蕉| 在线视频一区二区| 欧美自拍偷拍| 正在播放日韩| 久久超碰97中文字幕| av成人黄色| 欧美一区二区三区成人 | 久久青草欧美一区二区三区| 欧美大色视频| 久久久久国产精品www| 欧美女同在线视频| 久久精品电影| 欧美三级在线播放| 免费在线亚洲| 国产精品自拍三区| 日韩视频在线永久播放| 亚洲成人中文| 欧美一区二区大片| 亚洲一区二区在线看| 欧美成人在线网站| 久久尤物电影视频在线观看| 国产精品日本精品| 亚洲美女黄网| 亚洲人成在线观看网站高清| 欧美一级淫片播放口| 欧美一区二区三区视频在线| 美女日韩在线中文字幕| 亚洲欧美久久| 欧美激情一区二区三区不卡| 久久综合一区二区| 国产精品一区久久久久| 亚洲精品乱码久久久久久久久 | 先锋影音国产精品| 欧美日韩国产限制| 欧美高清一区二区| 韩国美女久久| 久久xxxx| 美女性感视频久久久| 国产一区二区三区久久悠悠色av| 一区二区三区四区国产精品| 亚洲午夜久久久| 欧美日韩国产精品一区二区亚洲 | 亚洲女爱视频在线| 午夜精品影院| 国产精品日韩欧美一区二区| 亚洲最新合集| 亚洲性感美女99在线| 欧美日韩在线播放| 亚洲免费久久| 在线一区二区三区做爰视频网站 | 亚洲人成在线播放| 欧美精品18| 一区二区免费在线观看| 午夜精品电影| 国产亚洲高清视频| 久久国产色av| 亚洲激情网址| 亚洲曰本av电影| 国产视频一区二区在线观看| 欧美在线3区| 欧美激情成人在线| 亚洲最新中文字幕| 国产精品毛片va一区二区三区 | 亚洲日本va在线观看| 亚洲午夜一区二区| 国产日本欧美在线观看| 久久久蜜桃一区二区人| 亚洲国产精品国自产拍av秋霞| 一区二区日韩| 国产亚洲一区二区三区在线播放| 久久久久久久综合狠狠综合| 亚洲二区免费| 久久都是精品| 99国产精品久久久久老师| 国产精品久久久久久久午夜片| 欧美亚洲一区二区在线| 欧美电影在线免费观看网站| 亚洲一区二区在线播放| 在线日韩成人| 国产精品视频不卡| 你懂的国产精品| 亚洲自拍高清| 亚洲欧洲精品天堂一级| 欧美在线黄色| 一区二区三区高清视频在线观看| 国产亚洲福利| 欧美日韩综合在线| 欧美日韩伊人| 久久gogo国模裸体人体| 美女日韩欧美| 亚洲一二区在线| 亚洲国产小视频在线观看| 国产伦精品一区二区三区免费迷 | 蜜桃久久av一区| 午夜视频久久久久久| 亚洲精品社区| 欧美成人黄色小视频| 欧美在线一区二区| 亚洲视频久久| 日韩天堂在线观看| 1024亚洲| 黄色成人91| 国产日韩在线播放| 国产精品va| 欧美日韩高清在线观看|