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

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

 

来源:http://www.cppblog.com/PeakGao/archive/2007/10/29/35439.html

前面写了几篇文章了,最后的目的之一就是为了缓存ACE_Message_Block,代码简单,应该比先前的(《ACE中ACE_Message_Block的缓存处理》)实现要好,先前在使用不当的情况下会有问题的,如clone

// 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 <ace/Lock_Adapter_T.h>

#include "MemPoolT.h"
#include "MemPoolAllocator.h"

namespace om{

    class MessageBlockManager
    {
        typedef ACE_Lock_Adapter<ACE_SYNCH_MUTEX> MyLock;

        My_Allocator    mDataPool;    /// 为数据缓冲分配
        My_Allocator    mDBPool;    /// 为ACE_Data_Block对象本身分配
        My_Allocator    mMBPool;    /// 为ACE_Message_Block对象本身分配
        MyLock            mLock;        /// 同步锁

    public:
        static MessageBlockManager* instance();

        MessageBlockManager();
        ~MessageBlockManager();

        /// 初始化参数
        void create(size_t bufSize, size_t growObjCount);

        /// 清除缓冲池
        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()
    {
    }

    MessageBlockManager::~MessageBlockManager()
    {
        clear();
    }

    void MessageBlockManager::clear()
    {
        ACE_GUARD(MyLock, ace_mon, mLock);

        mDataPool.clear();
        mDBPool.clear();
        mMBPool.clear();
    }

    void MessageBlockManager::create(size_t bufSize, size_t growObjCount)
    {
        mDataPool.create(bufSize, growObjCount);
        mDBPool.create(sizeof(ACE_Data_Block), growObjCount);
        mMBPool.create(sizeof(ACE_Message_Block), growObjCount);
    }

    ACE_Message_Block* MessageBlockManager::alloc()
    {
        ACE_GUARD_RETURN(MyLock, ace_mon, mLock, NULL);

        void* mb_buf = mMBPool.alloc();
        size_t data_size = mDataPool.getBlockSize();

        // 直接调用构造
        ACE_Message_Block* mb = ::new (mb_buf) ACE_Message_Block(
                                                data_size,  // size
                                                ACE_Message_Block::MB_DATA,    // type
                                                0,            // cont
                                                0,            // data
                                                &mDataPool, // allocator_strategy
                                                0, // locking_strategy 我们的mLock不要传入,因为前面有mMBPool.alloc()方法需要加锁
                                                ACE_DEFAULT_MESSAGE_BLOCK_PRIORITY, // priority
                                                ACE_Time_Value::zero,        // execution_time
                                                ACE_Time_Value::max_time,    // deadline_time
                                                &mDBPool,    // data_block_allocator
                                                &mMBPool    // message_block_allocator
                                            );

        return mb;
    }

    void MessageBlockManager::free(ACE_Message_Block* mb)
    {
        ACE_GUARD(MyLock, ace_mon, mLock);

        mb->release();
    }


} // namespace om

 

演示代码:
void test()
{
    using namespace om;

    MessageBlockManager::instance()->create(1024, 256);
    ACE_Message_Block* mb = MessageBlockManager::instance()->alloc();
    mb->copy("1234567890", 11);
    assert(strcmp(mb->base(), "1234567890") == 0);
    ACE_Message_Block* mb_clone = mb->clone();
    MessageBlockManager::instance()->free(mb);
    MessageBlockManager::instance()->free(mb_clone);
    MessageBlockManager::instance()->clear();
}

 

如果直接为ACE_Message_Block实现对象的new/delete操作,可能用起来更方便,大家可以试试,这里我不改了。

 

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

Please Login (or Sign Up) to leave a comment