找回密码
 用户注册

QQ登录

只需一步,快速开始

楼主: freeeyes

关于Proactor使用Handler池内存泄露的问题

  [复制链接]
 楼主| 发表于 2010-7-26 14:40:11 | 显示全部楼层
这里确实需要修改一下ACE的源代码。
给ACE_Asynch_Read_Stream增加两个接口。把原来的
  1. int
  2. ACE_Asynch_Read_Stream:open (ACE_Handler &handler,
  3.                               ACE_HANDLE handle,
  4.                               const void *completion_key,
  5.                               ACE_Proactor *proactor)
  6. {
  7.   // Get a proactor for/from the user.
  8.   proactor = this->get_proactor (proactor, handler);
  9.   // Now let us get the implementation initialized.
  10.   if ((this->implementation_ = proactor->create_asynch_read_stream ()) == 0)
  11.     return -1;
  12.   // Call the <open> method of the base class.
  13.   return ACE_Asynch_Operation:open (handler,
  14.                                      handle,
  15.                                      completion_key,
  16.                                      proactor);
  17. }
  18. 拆分成两个新的函数
  19. int
  20. ACE_Asynch_Read_Stream::Create(ACE_Handler &handler,
  21.                               ACE_HANDLE handle,
  22.                               ACE_Proactor *proactor)
  23. {
  24.   proactor = this->get_proactor (proactor, handler);
  25.   // Now let us get the implementation initialized.
  26.   if ((this->implementation_ = proactor->create_asynch_read_stream ()) == 0)
  27.     return -1;
  28.   return 0;
  29. }
  30. int
  31. ACE_Asynch_Read_Stream::Bind(ACE_Handler &handler,
  32.                               ACE_HANDLE handle,
  33.                               const void *completion_key,
  34.                               ACE_Proactor *proactor)
  35. {
  36.   // Call the <open> method of the base class.
  37.   return ACE_Asynch_Operation:open (handler,
  38.                                      handle,
  39.                                      completion_key,
  40.                                      proactor);
  41. }
复制代码
修改了一下ACE的源码,ACE_Asynch_Read_Stream和ACE_Asynch_Write_Stream对象,修改后,在高并发下CPU使用率明显降低。不过不能要求每个使用者都要重新改写一下ACE的代码吧。。。
既然ACE的Proactor提供了make_handler()方法,就是说明鼓励你使用自己的handler池,但是,这里却留下了一个陷阱。正在下载5.8看看有没有变化,modern在不,有QQ没?呵呵,加我一个吧。
发表于 2010-7-26 15:28:51 | 显示全部楼层
我抽空给代码维护者发信说明一下。这个的确是问题。
 楼主| 发表于 2010-7-26 16:32:41 | 显示全部楼层
 楼主| 发表于 2010-7-26 16:32:43 | 显示全部楼层
 楼主| 发表于 2010-7-26 16:33:29 | 显示全部楼层
七猫解决了,他的方法是重载了这个对象,我按照这个方法改,已经没有问题了。
发表于 2010-7-30 22:43:45 | 显示全部楼层
如winston所讲,还是给ACE user发封信去在代码中去彻底解决这个问题
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-5-5 02:12 , Processed in 0.012866 second(s), 4 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表