peakzhang 发表于 2007-12-26 22:33:23

抽丝剥茧,ACE_Message_Block 的尺寸辨析(2)

4、total_size()
──────────────────────

size_t
ACE_Message_Block::total_size (void) const
{
ACE_TRACE ("ACE_Message_Block::total_size");
size_t size = 0;
for (const ACE_Message_Block *i = this;
       i != 0;
       i = i->cont ())
    size += i->size ();
return size;
}

这个方法,返回的是内部单链表中的所有消息块的设置尺寸size()之和。
───────────────────────────
5、total_size_and_length()
───────────────────────────


void
ACE_Message_Block::total_size_and_length (size_t &mb_size,
                                          size_t &mb_length) const
{
ACE_TRACE ("ACE_Message_Block::total_size_and_length");
for (const ACE_Message_Block *i = this;
       i != 0;
       i = i->cont ())
    {
      mb_size += i->size ();
      mb_length += i->length ();
    }
}


这个方法其实是total_size()和total_length()合并调用的结果。
───────────────────────────
6、capacity()
──────────────────────
ACE_INLINE size_t
ACE_Data_Block::capacity (void) const
{
ACE_TRACE ("ACE_Data_Block::capacity");
return this->max_size_;
}这个方法返回的是此消息块能够存储数据的最大值
───────────────────────────
7、total_capacity()
───────────────────────────

size_t
ACE_Message_Block::total_capacity (void) const
{
ACE_TRACE ("ACE_Message_Block::total_capacity");
size_t size = 0;
for (const ACE_Message_Block *i = this;
       i != 0;
       i = i->cont ())
    size += i->capacity ();
return size;
}

这个方法返回的是内部单链表中所有消息块的最大存储量之和。
──────────────────────────
8、space()
──────────────────────────

ACE_INLINE size_t
ACE_Message_Block::space (void) const
{
ACE_TRACE ("ACE_Message_Block::space");
return this->mark () - this->wr_ptr ();
}
这个mark是什么呢?
// Return a pointer to 1 past the end of the data buffer.
ACE_INLINE char *
ACE_Data_Block::mark (void) const
{
ACE_TRACE ("ACE_Data_Block::mark");
return this->base_ + this->cur_size_;
}
ACE_INLINE char *
ACE_Message_Block::mark (void) const
{
ACE_TRACE ("ACE_Message_Block::mark");
return this->data_block ()->mark ();
}

这个方法是计算当前消息块,还剩下多少可写空间。
相信做了这些辨析后,写代码应该不会再产生误用了。


Winston原创,ACE开发者论坛版权所有。www.acejoy.com

peakzhang 发表于 2007-12-26 22:33:45

补充:

                  rd_ptr,wr_ptr   
                         ||
                         vv
                        +--+--+--+--+--+--+--+--------------+--+--+--+
                        ||||||||      ..... ||||
                        +--+--+--+--+--+--+--+--------------+--+--+--+
                         ^                                       ^^
                         |                                       ||
                        base                                    mark,end
                        
                        
ACE_Message_Block::size() == ACE_Data_Block::size() == mark - base
ACE_Message_Block::capacity() == ACE_Data_Block::capacity() == end - base
ACE_Message_Block::length() == wr_ptr - rd_ptr
ACE_Message_Block::space() == mark - wr_ptr

wanminny 发表于 2010-5-15 14:05:39

页: [1]
查看完整版本: 抽丝剥茧,ACE_Message_Block 的尺寸辨析(2)