ACE中ACE_Message_Block的缓存处理

基于我前一篇文章《基于ACE实现的一个内存池》的代码,这里是应用,有问题不要打我。。。

// 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 
"MemPoolT.h"

namespace om{

    
class MessageBlockManager
    
{
        typedef CachePool
<ACE_SYNCH_MUTEX>    MyCachePool;

        MyCachePool            mBufPool;    
/// 缓存ACE_Data_Block的缓冲区
        MyCachePool            mDBPool;    /// 缓存ACE_Data_Block对象本身,由于不能默认构造,所以没有用ObjectPool模版
        MyCachePool            mMBPool;    /// 缓存ACE_Message_Block对象本身,由于不能默认构造,所以没有用ObjectPool模版
        ACE_SYNCH_MUTEX*    mMutex;        /// 线程同步

    
public:
        
static MessageBlockManager* instance();

        MessageBlockManager();
        
~MessageBlockManager();

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

        
/// 清除缓冲池
        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()
        : mMutex(NULL)
    
{
    }


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


    
void MessageBlockManager::clear()
    
{
        
if (mMutex)
        
{
            mBufPool.clear();
            mDBPool.clear();
            mMBPool.clear();

            delete mMutex;
            mMutex 
= NULL;
        }

    }


    
void MessageBlockManager::create(size_t bufSize, size_t objCount)
    
{
        
if (!mMutex)
            mMutex 
= new ACE_SYNCH_MUTEX();

        mBufPool.create(bufSize, objCount, mMutex);
        mDBPool.create(
sizeof(ACE_Data_Block), objCount, mMutex);
        mMBPool.create(
sizeof(ACE_Message_Block), objCount, mMutex);
    }


    ACE_Message_Block
* MessageBlockManager::alloc()
    
{
        
void* buf = mBufPool.alloc();

        ACE_Data_Block
* db = ::new (mDBPool.alloc()) ACE_Data_Block(mBufPool.getBlockSize(), 
            ACE_Message_Block::MB_DATA, static_cast
<const char*>(buf), 00, ACE_Message_Block::DONT_DELETE, 0);

        ACE_Message_Block
* mb = ::new (mMBPool.alloc()) ACE_Message_Block(db, ACE_Message_Block::DONT_DELETE);
        
        
return mb;
    }


    
void MessageBlockManager::free(ACE_Message_Block* mb)
    
{
        
// 不要调用对象的release方法
        mBufPool.free(mb->base());

        ACE_Data_Block
* db = mb->data_block();
        db
->~ACE_Data_Block();
        mDBPool.free(db);

        mb
->~ACE_Message_Block();
        mMBPool.free(mb);
    }



}
 // namespace om

posted on 2007-10-28 20:38 PeakGao 阅读(3688) 评论(5)  编辑 收藏 引用 所属分类: C++技术

评论

# re: ACE中ACE_Message_Block的缓存处理 2007-10-28 22:14 Minidx全文检索

ACE执行效率方面怎么样?  回复  更多评论   

# re: ACE中ACE_Message_Block的缓存处理[未登录] 2007-10-29 08:06 PeakGao

@Minidx全文检索

执行效率不错,当然比你用纯API写的差,毕竟为了框架的合理和跨平台封装,导致了不少的函数调用开销,但这些对于应用来讲可以忽略,除非你用在某些实时行特别高的地方  回复  更多评论   

# re: ACE中ACE_Message_Block的缓存处理 2007-10-29 10:18 Minidx全文检索

谢谢!  回复  更多评论   

# re: ACE中ACE_Message_Block的缓存处理[未登录] 2007-10-31 13:39 erran

大致看了看ACE,总感觉他太大了,不怎么想用,不过实在是很全面....  回复  更多评论   

# re: ACE中ACE_Message_Block的缓存处理 2008-03-14 23:29 happychui

这个类有内存泄露,原因是用全局的instance,用的时候申请了,但没自动delete
把instance()改如下
MessageBlockManager* MessageBlockManager::instance()
{
static MessageBlockManager mbm;
return &mbm;
}  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


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

导航

统计

常用链接

留言簿(9)

随笔分类(67)

随笔档案(65)

搜索

最新评论

阅读排行榜

评论排行榜