基于我前一篇文章《
基于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), 0, 0, 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