关于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)
请指教。这个错误,是经常出现,不是每次必出现。 期待版主和各位大侠的指导! 看似好像内存池满了,申请不到内存了。
要查一下你当前获取的内存池对象是不是都还回去了。如果没有,内存曲线就会不断的狂涨。
先确定这个问题吧。 ACE_Message_Block* CMessageBlockManager::Create(uint32 u4Size)函数返回一个ACE_Message_Block*指针,用完后,就release了,这样算是归还内存池么?这部分代码,没有改啊,你版主服务器源码里面的。 期待版主进一步指点! 你把你的测试用例给我看看。 在linux平台,发送数据的时候,一般是在突发性大批量数据发送的时候,会在文件ConnectHandler.cpp的函数SendMessage中的
pMbData = App_MessageBlockManager::instance()->Create(pBuffPacket->GetPacketLen());
处报以上错误! 你加我的QQ吧。 你QQ多少? 在我的开源服务器置顶帖中搜索QQ,就看见了。
页:
[1]