作者:PeakGao 来源:C++博客   酷勤网收集 2007-11-13

摘要
  基于我前一篇文章《基于ACE实现的一个内存池》的代码,本文是应用。

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

来自:http://www.cppblog.com/PeakGao/archive/2007/10/28/35364.html

分类: C++名库 编程语言



关于酷勤 | 联系方式 | 免责声明 | 友情链接