贝贝花花包包店,精品555皮具,钱夹,皮夹

字体:  

ACE_Message_Block内存池

peakzhang 发表于: 2008-1-15 21:46 来源: ACE 开发者

请问一下有没有基于ACE_Message_Block的内存池的实现代码。。每个Msg里面的ACE_Data_Block都是固定大小的。

最新回复

peakzhang at 2008-1-15 21:46:13
需要改变Message_Block的分配器
peakzhang at 2008-1-15 21:46:40
搞定了。。把代码粘出来。希望对大家有用。。

CODE:


#ifndef _ACE_MESSAGE_BLOCK_MANAGER
#define _ACE_MESSAGE_BLOCK_MANAGER
#include "Config.h"
class CMsgMgr
{
public:
CMsgMgr() {};
virtual ~CMsgMgr(){};
public:
void Init( int msgsize = 1024, int msgnum = 2048 );
    void Release();

ACE_Message_Block * AllocMsg( void );

private:
     ACE_Recursive_Thread_Mutex _lock;
  ACE_Allocator * msg_allocator_;
  ACE_Allocator * data_allocator_;
  ACE_Allocator * buff_allocator_;
};
ACE_Message_Block * CMsgMgr::AllocMsg( void )
{
ACE_Message_Block *msg;
ACE_NEW_MALLOC_RETURN( msg,
  static_cast<ACE_Message_Block*>( msg_allocator_->malloc(sizeof( ACE_Message_Block ) ) ),
  ACE_Message_Block( 1024,0,0,0,buff_allocator_,0,0,ACE_Time_Value::zero,ACE_Time_Value::max_time,data_allocator_,msg_allocator_ ),
  0
  );
msg->reset();
return msg;
}

void CMsgMgr::Init(int msgsize /* = 1024 */, int msgnum /* = 2048  */)
{

typedef char BUFFCOUNT[1024];
msg_allocator_=new ACE_Cached_Allocator<ACE_Message_Block,ACE_SYNCH_MUTEX>(msgnum);
data_allocator_ =new ACE_Cached_Allocator<ACE_Data_Block,ACE_SYNCH_MUTEX>(msgnum*2);
    buff_allocator_ = new ACE_Cached_Allocator<BUFFCOUNT,ACE_SYNCH_MUTEX>(msgnum*2);


}

void CMsgMgr::Release()
{
    delete msg_allocator_;
delete data_allocator_;
delete buff_allocator_;
}

typedef ACE_Singleton<CMsgMgr, ACE_Null_Mutex> MsgMgr;
#endif
peakzhang at 2008-1-15 21:47:14
初始化

MsgMgr::instance()->Init();

用的时候只要这样子。

ACE_Message_Block* pMsg = MsgMgr::instance()->AllocMsg();

用完

pMsg->release();

结束

MsgMgr::instance()->release();