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