yleesun 发表于 2013-3-18 18:10:23

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

本帖最后由 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)
请指教。这个错误,是经常出现,不是每次必出现。

yleesun 发表于 2013-3-19 08:15:23

期待版主和各位大侠的指导!

freeeyes 发表于 2013-3-19 16:39:53

看似好像内存池满了,申请不到内存了。
要查一下你当前获取的内存池对象是不是都还回去了。如果没有,内存曲线就会不断的狂涨。
先确定这个问题吧。

yleesun 发表于 2013-3-19 17:35:25

ACE_Message_Block* CMessageBlockManager::Create(uint32 u4Size)函数返回一个ACE_Message_Block*指针,用完后,就release了,这样算是归还内存池么?这部分代码,没有改啊,你版主服务器源码里面的。

yleesun 发表于 2013-3-20 08:00:50

期待版主进一步指点!

freeeyes 发表于 2013-3-20 09:10:40

你把你的测试用例给我看看。

yleesun 发表于 2013-3-20 11:09:09

在linux平台,发送数据的时候,一般是在突发性大批量数据发送的时候,会在文件ConnectHandler.cpp的函数SendMessage中的
pMbData = App_MessageBlockManager::instance()->Create(pBuffPacket->GetPacketLen());
处报以上错误!

freeeyes 发表于 2013-3-20 13:16:07

你加我的QQ吧。

yleesun 发表于 2013-3-20 13:27:53

你QQ多少?

freeeyes 发表于 2013-3-20 14:41:08

在我的开源服务器置顶帖中搜索QQ,就看见了。
页: [1]
查看完整版本: 关于ACE开源服务器代码(V0.87)问题。