锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
]]>
2銆佸彲浠ョ◢鍔犳敼鍔ㄦ垚涓涓瀭鐩存悳绱㈠紩鎿庯紱
3銆佸彲浠ユ彁渚涙悳绱㈤鍩熺殑idea錛屽鏋渋dea鍙錛屾湰浜哄彲浠ュ悎浣滄柟寮忓疄鐜拌idea錛?br>4銆佸彲浠ユ彁渚涙暣濂楁湇鍔★紝鍖呮嫭铚樿洓銆佸垎璇嶃佺儲寮曘佹悳绱㈡湇鍔★紱
閮侀椃錛屾劅瑙塩ppblog鐨勪漢姘斾笉澶燂紝鏄笉鏄冭檻鎼鍒癱sdn鍛紵濂囨簡cppblog鍒犺創錛?
]]>
]]>
]]>
]]>
// 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();
/**//// 鍒濆鍖栧弬鏁?/span>
void create(size_t bufSize, size_t objCount);
/**//// 娓呴櫎緙撳啿姹?/span>
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)
{
// 涓嶈璋冪敤瀵硅薄鐨剅elease鏂規硶
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
]]>
]]>
浠婂ぉ鐪嬩簡涓嬪畠鐨勫唴瀛樺垎閰嶏紝鍋氫簡鐐硅褰曪紝鍚屽ぇ瀹朵竴璧峰垎浜笅錛岃繕娌$湅瀹岋紝娌℃湁璁插埌鐨勫埆闂垜銆傘傘?br>
涓銆佸唴瀛樺垎閰嶅櫒鐩稿叧
ACE_Allocator
鍩虹被
ACE_New_Allocator : public ACE_Allocator
浼犵粺鐨刵ew鍜宒elete鐨勫姩鎬佸唴瀛樺垎閰嶅櫒錛屼富瑕佹柟娉曪細
malloc 鍒嗛厤涓瀹氬ぇ灝忕殑鍐呭瓨錛屽疄璐ㄥ氨鏄痭ew char[nbytes]錛?br>calloc 鍚屼笂錛屼絾甯﹀唴瀛樺垵濮嬪寲
free 閲婃斁鎸囧畾鐨勫唴瀛樺潡錛屽疄璐ㄥ氨鏄痙elete[] ptr;
ACE_Static_Allocator_Base : public ACE_Allocator
闈欐佸唴瀛樺垎閰嶅櫒錛屼竴嬈℃у垎閰嶄竴涓ぇ鍐呭瓨錛屾瘮濡?00M錛岀劧鍚庡湪200M鍐呭垎閰?宸茬粡涓嶈兘鍙垎閰嶄簡)鎸囧畾澶у皬鐨勫唴瀛樺潡
鎴愬憳錛?br>char *buffer_; /// 緙撳啿鍖洪鍦板潃
size_t size_; /// 緙撳啿鍖虹殑澶у皬
size_t offset_;/// 褰撳墠鍒嗛厤浣嶇疆
涓昏鏂規硶錛?br>malloc 鍒嗛厤涓瀹氬ぇ灝忕殑鍐呭瓨錛屽疄璐ㄥ氨鏄痓uffer_ + offset_ + nbytes錛屽綋瓚呰繃size_鏃跺垎閰嶅け璐?br>calloc 鍚屼笂錛屼絾甯﹀唴瀛樺垵濮嬪寲
free 閲婃斁鎸囧畾鐨勫唴瀛樺潡錛屽疄璐ㄦ槸絀烘搷浣?br>浠庡疄璐ㄦ潵鐪嬪彧閫傚悎棰勭煡娑堣楀唴瀛樺ぇ灝忚屼笖涓鑸笉榪涜閲婃斁鎿嶄綔鐨勬儏鍐典笅錛屽洜涓洪噴鏀懼悗鐨勫唴瀛樻病鏈夊緱鍒板簲鐢?/p>
template <class MALLOC>
class ACE_Allocator_Adapter : public ACE_Allocator
鍐呭瓨鍒嗛厤閫傞厤鍣紝瀵瑰悇縐嶅悇鏍風殑鍐呭瓨鍒嗛厤綾昏繘琛岄傞厤錛屼嬌涔嬬鍚圓CE_Allocator鎺ュ彛錛孧ALLOC鏄叿浣撶殑鍐呭瓨
鍒嗛厤瀹炵幇錛屾瘮濡備笂闈㈢殑ACE_New_Allocator錛孉CE_Static_Allocator_Base鍜岀敤鎴瘋嚜瀹氫箟鐨勫垎閰嶅櫒
浜屻佺┖闂插垪琛?br>
template <class T>
class ACE_Cached_Mem_Pool_Node
鏀寔鍙紦瀛樼殑瀵硅薄鑺傜偣錛屽彲鐢ㄤ簬絀洪棽閾捐〃(free_list)錛屽疄鐜頒簡set_next鍜実et_next
鎴愬憳錛?br>ACE_Cached_Mem_Pool_Node<T>* next_;
template <class T>
class ACE_Free_List
妯$増鍩虹被
涓昏鏂規硶錛?br>add 鍔犲叆涓涓妭鐐瑰埌絀洪棽閾捐〃
remove 縐婚櫎涓涓┖闂茶妭鐐癸紙緇欑敤鎴蜂嬌鐢級
size 閾捐〃褰撳墠鏈夋晥鐨勭┖闂茶妭鐐逛釜鏁?br>resize 閲嶆柊璁劇疆閾捐〃鑺傜偣涓暟
template <class T, class ACE_LOCK>
class ACE_Locked_Free_List : public ACE_Free_List<T>
甯﹂攣絳栫暐鐨勭┖闂插垪琛紝鍏跺疄闄や簡閿佺瓥鐣ワ紝瀹冭繕鏈夊叾浠栧嚑涓壒鐐癸細
1銆佸彲浠ュ畾鍒朵負涓涓函絀洪棽鍒楄〃錛屽氨鏄唴閮ㄤ笉璋冪敤new/delete錛岀敱澶栭儴澶勭悊錛屽湪鏋勯犳椂灝唌ode浼犲叆
ACE_PURE_FREE_LIST鍗沖彲錛岄粯璁ゆ槸ACE_FREE_LIST_WITH_POOL錛岃〃紺哄唴閮ㄥ湪闇瑕佹椂鍙互璋冪敤new/delete榪涜鎿嶄綔錛?br>2銆佹敮鎸佹按浣?water mark)鐨勬蹇碉紝涓涓綆姘翠綅(lwm)錛屼竴涓珮姘翠綅(hwm)錛屾按浣嶅彧瀵筸ode涓篈CE_FREE_LIST_WITH_POOL鏃惰搗浣滅敤
3銆佸綋鑺傜偣涓嶅鏃訛紝鏀寔涓嬈℃ч掑inc涓妭鐐癸紙N鐢辯敤鎴峰湪鏋勯犳椂浼犲叆錛夛紝鍙mode涓篈CE_FREE_LIST_WITH_POOL鏃惰搗浣滅敤
涓昏鏂規硶錛?br>add 鍔犲叆涓涓妭鐐癸紙鍙兘鏄敤鎴風敤瀹屼簡鐨勮妭鐐癸級錛屽鏋渕ode涓篈CE_PURE_FREE_LIST鎴栬卪ode涓篈CE_FREE_LIST_WITH_POOL鑰宻ize<hwm鏃跺厑璁稿姞鍏ワ紝鍚﹀垯delete鎺?br>remove 浠庣┖闂查摼琛ㄧЩ闄や竴涓妭鐐癸紙緇欑敤鎴蜂嬌鐢級錛屽綋mode涓篈CE_FREE_LIST_WITH_POOL鑰宻ize<=lwm鏃訛紝琛ㄧず鑺傜偣鏁拌繃灝戯紝緋葷粺浼氬垎閰峣nc涓妭鐐瑰嚭鏉ヤ互瑙g噧鐪変箣鎬ワ紝濡傛灉鏄疉CE_PURE_FREE_LIST妯″紡錛屽綋鑺傜偣鏁頒負0鏃訛紝remove灝嗚繑鍥濶ULL
resize 褰搈ode涓篈CE_FREE_LIST_WITH_POOL鏃舵湁鎰忎箟錛宺esize>size鏃訛紝鍒嗛厤resize-size涓妭鐐癸紝鍚﹀垯閲婃斁size-resize涓妭鐐?/p>
涓句緥錛?br>class MyClass
{
int dummy;
public:
MyClass() : dummy(99) {}
void foo()
{
std::cout<<dummy<<std::endl;
}
};
void test()
{
ACE_Locked_Free_List< ACE_Cached_Mem_Pool_Node< MyClass >, ACE_SYNCH_NULL_MUTEX> freeList; // 鐢ˋCE_SYNCH_NULL_MUTEX涓嶉渶瑕佸悓姝ワ紝絳夊悓浜庡崟綰跨▼
// 鍙栧嚭涓涓紙鍒嗛厤涓涓級
ACE_Cached_Mem_Pool_Node< MyClass >* node = freeList.remove();
MyClass* mc = node.addr();
// 鐢ㄤ竴涓?br> mc->foo();
// 涓嶇敤浜嗭紝閲婃斁鎺?br> freeList.add(node);
}
涓夈佸悇縐嶅唴瀛樺垎閰嶇瓥鐣?br>template <class T, class ACE_LOCK>
class ACE_Cached_Allocator : public ACE_New_Allocator
鏈夌紦瀛樺姛鑳界殑鍔ㄦ佸垎閰嶅櫒錛岄噰鐢ㄧ┖闂查摼琛ㄨ繘琛岃妭鐐圭鐞嗭紝絀洪棽閾捐〃鐨刴ode涓篈CE_PURE_FREE_LIST錛屽嵆鐪熸鐨刵ew/delete鐢盇CE_Cached_Allocator鑷繁鎿嶄綔錛?br>鏋勯犳椂鍙寚瀹氬垵濮嬪寲T鑺傜偣鐨勪釜鏁幫紝鑺傜偣鐨勫ぇ灝忕敱sizeof(T)鍐沖畾錛屽悓鏃惰繘琛屽瓧鑺傚榻愩?br>娉ㄦ剰錛?br>璇ュ垎閰嶅櫒鍐呴儴瀵筎綾誨瀷娌℃湁榪涜鏋勯犲拰鏋愭瀯錛屾墍浠ヤ笉閫傚悎class浣跨敤錛屽彲鐢ㄤ簬struct錛屽茍涓旇鍒嗛厤鍣ㄤ笉鏀寔鑷姩澧炲ぇ鍐呭瓨鍖猴紙涔熷氨鏄痯ool_鎴愬憳鍦ㄦ瀯閫犳椂灝辯‘瀹氫簡錛?br>錛屽綋鍐呭瓨涓嶅鏃訛紝鍒嗛厤浼氬け璐ャ?br>涓昏鎴愬憳錛?br>char *pool_; /// 鍐呭瓨鍧?br>ACE_Locked_Free_List<ACE_Cached_Mem_Pool_Node<T>, ACE_LOCK> free_list_; /// 絀洪棽鑺傜偣綆$悊
涓昏鏂規硶錛?br>malloc 鍒嗛厤涓涓猅鑺傜偣錛屽疄闄呭氨鏄?return free_list_.remove()->addr();
calloc 鍚屼笂錛屼絾浼氬垵濮嬪寲鍐呭瓨鏁版嵁
free 閲婃斁涓涓猅鑺傜偣錛屽疄闄呭氨鏄?free_list_.add ((ACE_Cached_Mem_Pool_Node<T> *) ptr);
template <class ACE_LOCK>
class ACE_Dynamic_Cached_Allocator : public ACE_New_Allocator
鍚屼笂錛屼絾鏄病鏈塗妯$増鍙傛暟錛屽浜嗕竴涓垚鍛榗hunk_size_錛屾瘡涓妭鐐圭殑澶у皬鐢辯敤鎴瘋嚜琛屽畾涔夛紝鍚屾牱涓嶅瓨鍦ㄦ瀯閫犲拰鏋愭瀯鍔熻兘錛屼粎浠呭仠鐣欏湪鍥哄畾鑺傜偣澶у皬鐨勭紦鍐插尯鐨勭鐞嗭紝鍐呴儴娌℃湁榪涜瀛楄妭瀵歸綈銆?br>
template <size_t POOL_SIZE>
class ACE_Static_Allocator : public ACE_Static_Allocator_Base
鍩轟簬鍫嗘爤鐨勯潤鎬佸唴瀛樺垎閰嶅櫒錛孭OOL_SIZE涓哄爢鏍堝ぇ灝?br>
銆愬師銆慍Edit & CRichEdit 浣跨敤鎶宸?/u>