基于我前一篇文章《
基于ACE实现的一个内存池》的代码,这里是应用,有问题不要打我。。。
// MessageBlockManager.h
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//**
* @date 2007.10.28
* @author PeakGao <peakgao163@163.com>
*/
#ifndef OM_MESSAGEBLOCKMANAGER_H
#define OM_MESSAGEBLOCKMANAGER_H
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include <ace/thread_mutex.h>
#include <ace/synch_traits.h>
#include <ace/message_block.h>
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include "MemPoolT.h"
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
namespace om
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
class MessageBlockManager
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
typedef CachePool<ACE_SYNCH_MUTEX> MyCachePool;
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
MyCachePool mBufPool; /**//// 缓存ACE_Data_Block的缓冲区
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
MyCachePool mDBPool; /**//// 缓存ACE_Data_Block对象本身,由于不能默认构造,所以没有用ObjectPool模版
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
MyCachePool mMBPool; /**//// 缓存ACE_Message_Block对象本身,由于不能默认构造,所以没有用ObjectPool模版
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
ACE_SYNCH_MUTEX* mMutex; /**//// 线程同步
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
public:
static MessageBlockManager* instance();
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
MessageBlockManager();
~MessageBlockManager();
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// 初始化参数
void create(size_t bufSize, size_t objCount);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// 清除缓冲池
void clear();
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// 分配一个消息块
ACE_Message_Block* alloc();
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// 释放指定的消息块
void free(ACE_Message_Block* mb);
};
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
} // namespace om
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#endif // OM_MESSAGEBLOCKMANAGER_H
// MessageBlockManager.cpp
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//**
* @date 2007.10.28
* @author PeakGao <peakgao163@163.com>
*/
#include "MessageBlockManager.h"
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
namespace om
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
MessageBlockManager* MessageBlockManager::instance()
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
static MessageBlockManager* mbm = 0;
if (mbm == 0)
mbm = new MessageBlockManager();
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return mbm;
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
MessageBlockManager::MessageBlockManager()
: mMutex(NULL)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
MessageBlockManager::~MessageBlockManager()
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
clear();
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
void MessageBlockManager::clear()
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (mMutex)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
mBufPool.clear();
mDBPool.clear();
mMBPool.clear();
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
delete mMutex;
mMutex = NULL;
}
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
void MessageBlockManager::create(size_t bufSize, size_t objCount)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (!mMutex)
mMutex = new ACE_SYNCH_MUTEX();
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
mBufPool.create(bufSize, objCount, mMutex);
mDBPool.create(sizeof(ACE_Data_Block), objCount, mMutex);
mMBPool.create(sizeof(ACE_Message_Block), objCount, mMutex);
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
ACE_Message_Block* MessageBlockManager::alloc()
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
void* buf = mBufPool.alloc();
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
ACE_Data_Block* db = ::new (mDBPool.alloc()) ACE_Data_Block(mBufPool.getBlockSize(),
ACE_Message_Block::MB_DATA, static_cast<const char*>(buf), 0, 0, ACE_Message_Block::DONT_DELETE, 0);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
ACE_Message_Block* mb = ::new (mMBPool.alloc()) ACE_Message_Block(db, ACE_Message_Block::DONT_DELETE);
return mb;
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
void MessageBlockManager::free(ACE_Message_Block* mb)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
// 不要调用对象的release方法
mBufPool.free(mb->base());
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
ACE_Data_Block* db = mb->data_block();
db->~ACE_Data_Block();
mDBPool.free(db);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
mb->~ACE_Message_Block();
mMBPool.free(mb);
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
} // namespace om