handle_write_stream (const ACE_Asynch_Write_Stream::Result &result)的问题
void MyClass::handle_write_stream (const ACE_Asynch_Write_Stream::Result &result){
--io_count_; // del write io
// ACE_DEBUG ((LM_DEBUG, ACE_TEXT("handle_write: bytes_to_write %d, bytes_transfered %d, success %d, error %d\n"),
// result.bytes_to_write (), result.bytes_transferred (), result.success (), result.error ()));
if (result.error () == 0)
{
result.message_block().crunch ();
if (result.message_block().length() > 0)
{
// write the left data
...............
}
else
{
//sendqueue
...................
}
}
else
{
// 错误处理,回收ACE_Message_Block内存
..............
}
}
问题:什么时候result.error != 0
其中sendqueue会调用下面函数
int MyClass::send_end (MessageBlock* mb_write)
{
ACE_ASSERT(mb_write->length() > 0);
if (writer_.write(*mb_write, mb_write->length ()) != 0)
{
return -1;
}
++io_count_; // add write io
return 0;
} sendqueue在调用send_end时,会先new一块ACE_Message_Block内存,然后写该内存,再调用
send_end函数进行发送数据。正常情况下,send_end函数发送数据,调用handle_write_stream 回调函数,要么发送成功继续发送,要么发送失败回收内存。
现在出现的异常情况是:发送时内存一直在new,程序内存一直在涨。但一段时间后,内存集中回收,内存基本上还原到原始状态。 我再补充一下,还有一个ACE_Task线程每隔50ms调用sendqueue.
我估计内存在某一时刻不断增长,是不是由于回收内存太慢?而回收太慢的原因又是由于,异步IO处理能力处理不过来,发送(sendqueue)速度太快? 没理解你的代码。 给你一个模板代码,基本上都是这么写的。在写调用期间,不进行无关的send操作。
void SvcHandler::handle_write_stream (const ACE_Asynch_Write_Stream::Result &result)
{
//释放引用
ACE_Message_Block & mblk = result.message_block();
if(result.success())
{
//检查短写问题
mblk.rd_ptr(mblk.rd_ptr() - result.bytes_transferred());
// Partial write to socket
size_t unsent_data = result.bytes_to_write () - result.bytes_transferred ();
if (unsent_data != 0)
{
// Reset pointers
result.message_block ().rd_ptr (result.bytes_transferred ());
{
// Duplicate the message block and retry remaining data
if (m_writer.write (*mblk.duplicate(), unsent_data) == -1)
{
ACE_DEBUG((LM_DEBUG,"%D handle_write_stream error at line %l File %N,error code:%d, thread_id:%t\n",ACE_OS::last_error()));
mblk.release();
}
ACE_DEBUG((LM_DEBUG,"%D handle_write_stream resend data at line %l File %N,error code:%d, thread_id:%t\n",ACE_OS::last_error()));
}
}else
{
ACE_DEBUG((LM_DEBUG,"%D handle_write_stream send complete data at line %l File %N,error code:%d, thread_id:%t\n",ACE_OS::last_error()));
}
}else
{
ACE_DEBUG((LM_DEBUG,"%D handle_write_stream error at line %l File %N,error code:%d, thread_id:%t\n",ACE_OS::last_error()));
}
//释放
mblk.release();
}
页:
[1]