找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4595|回复: 4

handle_write_stream (const ACE_Asynch_Write_Stream::Result &result)的问题

[复制链接]
发表于 2009-1-14 19:00:40 | 显示全部楼层 |阅读模式
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;
}
 楼主| 发表于 2009-1-14 19:08:45 | 显示全部楼层
sendqueue在调用send_end时,会先new一块ACE_Message_Block内存,然后写该内存,再调用
send_end函数进行发送数据。正常情况下,send_end函数发送数据,调用handle_write_stream 回调函数,要么发送成功继续发送,要么发送失败回收内存。
现在出现的异常情况是:发送时内存一直在new,程序内存一直在涨。但一段时间后,内存集中回收,内存基本上还原到原始状态。
 楼主| 发表于 2009-1-15 09:43:37 | 显示全部楼层
我再补充一下,还有一个ACE_Task线程每隔50ms调用sendqueue.
我估计内存在某一时刻不断增长,是不是由于回收内存太慢?而回收太慢的原因又是由于,异步IO处理能力处理不过来,发送(sendqueue)速度太快?
发表于 2009-1-15 16:47:46 | 显示全部楼层
没理解你的代码。
发表于 2009-1-15 16:49:10 | 显示全部楼层
给你一个模板代码,基本上都是这么写的。在写调用期间,不进行无关的send操作。
  1. void SvcHandler::handle_write_stream (const ACE_Asynch_Write_Stream::Result &result)
  2. {
  3.   //释放引用
  4.   ACE_Message_Block & mblk = result.message_block();
  5.   if(result.success())
  6.   {
  7.    //检查短写问题
  8.    mblk.rd_ptr(mblk.rd_ptr() - result.bytes_transferred());
  9.    // Partial write to socket
  10.    size_t unsent_data = result.bytes_to_write () - result.bytes_transferred ();
  11.    if (unsent_data != 0)
  12.    {
  13.     // Reset pointers
  14.     result.message_block ().rd_ptr (result.bytes_transferred ());
  15.     {
  16.      // Duplicate the message block and retry remaining data
  17.      if (m_writer.write (*mblk.duplicate(), unsent_data) == -1)
  18.      {
  19.       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()));
  20.       mblk.release();
  21.      }
  22.      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()));
  23.     }
  24.    }else
  25.    {
  26.     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()));
  27.    }
  28.   }else
  29.   {
  30.    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()));
  31.   }
  32.   //释放
  33.   mblk.release();
  34. }
复制代码
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-12-23 22:16 , Processed in 0.021193 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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