找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 8061|回复: 9

关于ACE开源服务器代码(V0.87)问题。

[复制链接]
发表于 2013-3-18 18:10:23 | 显示全部楼层 |阅读模式
本帖最后由 yleesun 于 2013-3-19 08:14 编辑

最近在研究你写的服务器代码。现有一个问题请教:
在服务器运行的过程中,经常在发送数据的时候,会在ACE_Message_Block* CMessageBlockManager::Create(uint32 u4Size)中报错。错误指向了Malloc_T.cpp的函数:
emplate <ACE_MEM_POOL_1, class ACE_LOCK, class ACE_CB> void *
ACE_Malloc_T<ACE_MEM_POOL_2, ACE_LOCK, ACE_CB>::shared_malloc (size_t nbytes)
{
#if !defined (ACE_HAS_WIN32_STRUCTURAL_EXCEPTIONS)
  ACE_TRACE ("ACE_Malloc_T<ACE_MEM_POOL_2, ACE_LOCK, ACE_CB>::shared_malloc");
#endif /* !ACE_HAS_WIN32_STRUCTURAL_EXCEPTIONS */

  if (this->cb_ptr_ == 0)
    return 0;

  // Round up request to a multiple of the MALLOC_HEADER size.
  size_t const nunits =
    (nbytes + sizeof (MALLOC_HEADER) - 1) / sizeof (MALLOC_HEADER)
    + 1; // Add one for the <MALLOC_HEADER> itself.

  MALLOC_HEADER *prevp = 0;
  MALLOC_HEADER *currp = 0;

  ACE_SEH_TRY
    {
      // Begin the search starting at the place in the freelist where the
      // last block was found.
      prevp = this->cb_ptr_->freep_;
      currp = prevp->next_block_;
    }
#if defined (ACE_HAS_WIN32_STRUCTURAL_EXCEPTIONS)
  ACE_SEH_EXCEPT (this->memory_pool_.seh_selector (GetExceptionInformation ()))
    {
      currp = prevp->next_block_;
    }
#endif /* ACE_HAS_WIN32_STRUCTURAL_EXCEPTIONS */

  // Search the freelist to locate a block of the appropriate size.

  while (1)

    // *Warning* Do not use "continue" within this while-loop.

    {
      ACE_SEH_TRY
        {
          if (currp->size_ >= nunits) // Big enough   在这里出错。
            {
              ACE_MALLOC_STATS (++this->cb_ptr_->malloc_stats_.ninuse_);
              if (currp->size_ == nunits)
请指教。这个错误,是经常出现,不是每次必出现。
 楼主| 发表于 2013-3-19 08:15:23 | 显示全部楼层
期待版主和各位大侠的指导!
发表于 2013-3-19 16:39:53 | 显示全部楼层
看似好像内存池满了,申请不到内存了。
要查一下你当前获取的内存池对象是不是都还回去了。如果没有,内存曲线就会不断的狂涨。
先确定这个问题吧。
 楼主| 发表于 2013-3-19 17:35:25 | 显示全部楼层
ACE_Message_Block* CMessageBlockManager::Create(uint32 u4Size)函数返回一个ACE_Message_Block*指针,用完后,就release了,这样算是归还内存池么?这部分代码,没有改啊,你版主服务器源码里面的。
 楼主| 发表于 2013-3-20 08:00:50 | 显示全部楼层
期待版主进一步指点!
发表于 2013-3-20 09:10:40 | 显示全部楼层
你把你的测试用例给我看看。
 楼主| 发表于 2013-3-20 11:09:09 | 显示全部楼层
在linux平台,发送数据的时候,一般是在突发性大批量数据发送的时候,会在文件ConnectHandler.cpp的函数SendMessage中的
pMbData = App_MessageBlockManager::instance()->Create(pBuffPacket->GetPacketLen());
处报以上错误!
发表于 2013-3-20 13:16:07 | 显示全部楼层
你加我的QQ吧。
 楼主| 发表于 2013-3-20 13:27:53 | 显示全部楼层
你QQ多少?
发表于 2013-3-20 14:41:08 | 显示全部楼层
在我的开源服务器置顶帖中搜索QQ,就看见了。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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