xiaokousky 发表于 2009-1-14 19:00:40

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;
}

xiaokousky 发表于 2009-1-14 19:08:45

sendqueue在调用send_end时,会先new一块ACE_Message_Block内存,然后写该内存,再调用
send_end函数进行发送数据。正常情况下,send_end函数发送数据,调用handle_write_stream 回调函数,要么发送成功继续发送,要么发送失败回收内存。
现在出现的异常情况是:发送时内存一直在new,程序内存一直在涨。但一段时间后,内存集中回收,内存基本上还原到原始状态。

xiaokousky 发表于 2009-1-15 09:43:37

我再补充一下,还有一个ACE_Task线程每隔50ms调用sendqueue.
我估计内存在某一时刻不断增长,是不是由于回收内存太慢?而回收太慢的原因又是由于,异步IO处理能力处理不过来,发送(sendqueue)速度太快?

winston 发表于 2009-1-15 16:47:46

没理解你的代码。

winston 发表于 2009-1-15 16:49:10

给你一个模板代码,基本上都是这么写的。在写调用期间,不进行无关的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]
查看完整版本: handle_write_stream (const ACE_Asynch_Write_Stream::Result &result)的问题