ACE中ACE_Message_Block的缓存处理 - 续篇

前面写了几篇文章了,最后的目的之一就是为了缓存ACE_Message_Block,代码简单,应该比先前的(《ACE中ACE_Message_Block的缓存处理》)实现要好,先前在使用不当的情况下会有问题的,如clone

// MessageBlockManager.h
/**
 *    @date 2007.10.28
 *  @author PeakGao <peakgao163@163.com>
 
*/

#ifndef OM_MESSAGEBLOCKMANAGER_H
#define OM_MESSAGEBLOCKMANAGER_H

#include 
<ace/thread_mutex.h>
#include 
<ace/synch_traits.h>
#include 
<ace/message_block.h>
#include 
<ace/Lock_Adapter_T.h>

#include 
"MemPoolT.h"
#include 
"MemPoolAllocator.h"

namespace om{

    
class MessageBlockManager
    
{
        typedef ACE_Lock_Adapter
<ACE_SYNCH_MUTEX> MyLock;

        My_Allocator    mDataPool;    
/// 为数据缓冲分配
        My_Allocator    mDBPool;    /// 为ACE_Data_Block对象本身分配
        My_Allocator    mMBPool;    /// 为ACE_Message_Block对象本身分配
        MyLock            mLock;        /// 同步锁

    
public:
        
static MessageBlockManager* instance();

        MessageBlockManager();
        
~MessageBlockManager();

        
/// 初始化参数
        void create(size_t bufSize, size_t growObjCount);

        
/// 清除缓冲池
        void clear();

        
/// 分配一个消息块
        ACE_Message_Block* alloc();

        
/// 释放指定的消息块
        void free(ACE_Message_Block* mb);
    }
;

}
 // namespace om

#endif // OM_MESSAGEBLOCKMANAGER_H

// MessageBlockManager.cpp
/**
 *    @date 2007.10.28
 *  @author PeakGao <peakgao163@163.com>
 
*/

 
#include 
"MessageBlockManager.h"

namespace om{

    
    MessageBlockManager
* MessageBlockManager::instance()
    
{
        
static MessageBlockManager* mbm = 0;
        
if (mbm == 0)
            mbm 
= new MessageBlockManager();
        
return mbm;
    }


    MessageBlockManager::MessageBlockManager()
    
{
    }


    MessageBlockManager::
~MessageBlockManager()
    
{
        clear();
    }


    
void MessageBlockManager::clear()
    
{
        ACE_GUARD(MyLock, ace_mon, mLock);

        mDataPool.clear();
        mDBPool.clear();
        mMBPool.clear();
    }


    
void MessageBlockManager::create(size_t bufSize, size_t growObjCount)
    
{
        mDataPool.create(bufSize, growObjCount);
        mDBPool.create(
sizeof(ACE_Data_Block), growObjCount);
        mMBPool.create(
sizeof(ACE_Message_Block), growObjCount);
    }


    ACE_Message_Block
* MessageBlockManager::alloc()
    
{
        ACE_GUARD_RETURN(MyLock, ace_mon, mLock, NULL);

        
void* mb_buf = mMBPool.alloc();
        size_t data_size 
= mDataPool.getBlockSize();

        
// 直接调用构造
        ACE_Message_Block* mb = ::new (mb_buf) ACE_Message_Block(
                                                data_size,  
// size
                                                ACE_Message_Block::MB_DATA,    // type
                                                0,            // cont
                                                0,            // data
                                                &mDataPool, // allocator_strategy
                                                0// locking_strategy 我们的mLock不要传入,因为前面有mMBPool.alloc()方法需要加锁
                                                ACE_DEFAULT_MESSAGE_BLOCK_PRIORITY, // priority
                                                ACE_Time_Value::zero,        // execution_time
                                                ACE_Time_Value::max_time,    // deadline_time
                                                &mDBPool,    // data_block_allocator
                                                &mMBPool    // message_block_allocator
                                            );

        
return mb;
    }


    
void MessageBlockManager::free(ACE_Message_Block* mb)
    
{
        ACE_GUARD(MyLock, ace_mon, mLock);

        mb
->release();
    }



}
 // namespace om

演示代码:
void test()
{
    
using namespace om;

    MessageBlockManager::instance()
->create(1024256);
    ACE_Message_Block
* mb = MessageBlockManager::instance()->alloc();
    mb
->copy("1234567890"11);
    assert(strcmp(mb
->base(), "1234567890"== 0);
    ACE_Message_Block
* mb_clone = mb->clone();
    MessageBlockManager::instance()
->free(mb);
    MessageBlockManager::instance()
->free(mb_clone);
    MessageBlockManager::instance()
->clear();
}

如果直接为ACE_Message_Block实现对象的new/delete操作,可能用起来更方便,大家可以试试,这里我不改了。

posted on 2007-10-29 12:57 PeakGao 阅读(2518) 评论(0)  编辑 收藏 引用 所属分类: C++技术


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2007年10月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

导航

统计

常用链接

留言簿(9)

随笔分类(67)

随笔档案(65)

搜索

最新评论

阅读排行榜

评论排行榜