支持HW团队,就支付宝领取下面的红包吧! (打开支付宝就能领取!er1OEj73Uj), (打开支付宝收索“516503473”), 你领取消费,HW有奖励。红包使用无条件限制,有条件请注意是不是有病毒。

Login or Sign up | Validate
| Search
HelloWorld论坛 : > 计算机科学、技术、教学> 编程专题> 开源免费项目> [转]ACE中ACE_Message_Block的缓存处理
 
 
 
 
类别:ACE 阅读:5551 评论:0 时间:April 11, 2012, 11:39 a.m. 关键字:ACE 内存

 

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

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

 

个人签名--------------------------------------------------------------------------------

Please Login (or Sign Up) to leave a comment