找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4281|回复: 3

ACE_Message_Block内存池

[复制链接]
发表于 2008-1-15 21:46:08 | 显示全部楼层 |阅读模式
请问一下有没有基于ACE_Message_Block的内存池的实现代码。。每个Msg里面的ACE_Data_Block都是固定大小的。
 楼主| 发表于 2008-1-15 21:46:13 | 显示全部楼层
需要改变Message_Block的分配器
 楼主| 发表于 2008-1-15 21:46:40 | 显示全部楼层
搞定了。。把代码粘出来。希望对大家有用。。
  1. #ifndef _ACE_MESSAGE_BLOCK_MANAGER
  2. #define _ACE_MESSAGE_BLOCK_MANAGER
  3. #include "Config.h"
  4. class CMsgMgr
  5. {
  6. public:
  7. CMsgMgr() {};
  8. virtual ~CMsgMgr(){};
  9. public:
  10. void Init( int msgsize = 1024, int msgnum = 2048 );
  11.     void Release();
  12. ACE_Message_Block * AllocMsg( void );
  13. private:
  14.      ACE_Recursive_Thread_Mutex _lock;
  15.   ACE_Allocator * msg_allocator_;
  16.   ACE_Allocator * data_allocator_;
  17.   ACE_Allocator * buff_allocator_;
  18. };
  19. ACE_Message_Block * CMsgMgr::AllocMsg( void )
  20. {
  21. ACE_Message_Block *msg;
  22. ACE_NEW_MALLOC_RETURN( msg,
  23.   static_cast<ACE_Message_Block*>( msg_allocator_->malloc(sizeof( ACE_Message_Block ) ) ),
  24.   ACE_Message_Block( 1024,0,0,0,buff_allocator_,0,0,ACE_Time_Value::zero,ACE_Time_Value::max_time,data_allocator_,msg_allocator_ ),
  25.   0
  26.   );
  27. msg->reset();
  28. return msg;
  29. }
  30. void CMsgMgr::Init(int msgsize /* = 1024 */, int msgnum /* = 2048  */)
  31. {
  32. typedef char BUFFCOUNT[1024];
  33. msg_allocator_=new ACE_Cached_Allocator<ACE_Message_Block,ACE_SYNCH_MUTEX>(msgnum);
  34. data_allocator_ =new ACE_Cached_Allocator<ACE_Data_Block,ACE_SYNCH_MUTEX>(msgnum*2);
  35.     buff_allocator_ = new ACE_Cached_Allocator<BUFFCOUNT,ACE_SYNCH_MUTEX>(msgnum*2);
  36. }
  37. void CMsgMgr::Release()
  38. {
  39.     delete msg_allocator_;
  40. delete data_allocator_;
  41. delete buff_allocator_;
  42. }
  43. typedef ACE_Singleton<CMsgMgr, ACE_Null_Mutex> MsgMgr;
  44. #endif
复制代码
 楼主| 发表于 2008-1-15 21:47:14 | 显示全部楼层
初始化

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

用的时候只要这样子。

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

用完

pMsg->release();

结束

MsgMgr::instance()->release();
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-23 13:34 , Processed in 0.014507 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表