diff options
author | Xiaohong Bao <bao@lindenlab.com> | 2011-07-20 16:05:19 -0600 |
---|---|---|
committer | Xiaohong Bao <bao@lindenlab.com> | 2011-07-20 16:05:19 -0600 |
commit | 48d949150cd445ce1e801a7a8ee67597a965f14b (patch) | |
tree | ba04dbf2438246c5b2842ae4aa5348ee7556ed7a | |
parent | f7861eaf4e50ca2b868179ced6258f9d936a2b9c (diff) |
add a debug setting "MemoryPrivatePoolEnabled" to turn on/off private memory pool.
-rw-r--r-- | indra/llcommon/llmemory.cpp | 51 | ||||
-rw-r--r-- | indra/llcommon/llmemory.h | 6 | ||||
-rw-r--r-- | indra/newview/app_settings/settings.xml | 13 | ||||
-rw-r--r-- | indra/newview/llappviewer.cpp | 2 |
4 files changed, 45 insertions, 27 deletions
diff --git a/indra/llcommon/llmemory.cpp b/indra/llcommon/llmemory.cpp index eb55bdae84..0d36009fc4 100644 --- a/indra/llcommon/llmemory.cpp +++ b/indra/llcommon/llmemory.cpp @@ -61,10 +61,6 @@ BOOL LLMemory::sEnableMemoryFailurePrevention = FALSE; LLPrivateMemoryPoolManager::mem_allocation_info_t LLPrivateMemoryPoolManager::sMemAllocationTracker; #endif -#ifndef _USE_PRIVATE_MEM_POOL_ -#define _USE_PRIVATE_MEM_POOL_ 1 -#endif - //static void LLMemory::initClass() { @@ -1386,7 +1382,7 @@ void LLPrivateMemoryPool::freeMem(void* addr) { return ; } - + lock() ; LLMemoryChunk* chunk = findChunk((char*)addr) ; @@ -1789,7 +1785,7 @@ bool LLPrivateMemoryPool::fillHashTable(U16 start, U16 end, LLMemoryChunk* chunk //-------------------------------------------------------------------- LLPrivateMemoryPoolManager* LLPrivateMemoryPoolManager::sInstance = NULL ; -LLPrivateMemoryPoolManager::LLPrivateMemoryPoolManager() +LLPrivateMemoryPoolManager::LLPrivateMemoryPoolManager(BOOL enabled) { mPoolList.resize(LLPrivateMemoryPool::MAX_TYPES) ; @@ -1797,6 +1793,8 @@ LLPrivateMemoryPoolManager::LLPrivateMemoryPoolManager() { mPoolList[i] = NULL ; } + + mPrivatePoolEnabled = enabled ; } LLPrivateMemoryPoolManager::~LLPrivateMemoryPoolManager() @@ -1839,12 +1837,20 @@ LLPrivateMemoryPoolManager::~LLPrivateMemoryPoolManager() } //static +void LLPrivateMemoryPoolManager::initClass(BOOL enabled) +{ + llassert_always(!sInstance) ; + + sInstance = new LLPrivateMemoryPoolManager(enabled) ; +} + +//static LLPrivateMemoryPoolManager* LLPrivateMemoryPoolManager::getInstance() { - if(!sInstance) - { - sInstance = new LLPrivateMemoryPoolManager() ; - } + //if(!sInstance) + //{ + // sInstance = new LLPrivateMemoryPoolManager(FALSE) ; + //} return sInstance ; } @@ -1860,6 +1866,11 @@ void LLPrivateMemoryPoolManager::destroyClass() LLPrivateMemoryPool* LLPrivateMemoryPoolManager::newPool(S32 type) { + if(!mPrivatePoolEnabled) + { + return NULL ; + } + if(!mPoolList[type]) { mPoolList[type] = new LLPrivateMemoryPool(type) ; @@ -1870,7 +1881,7 @@ LLPrivateMemoryPool* LLPrivateMemoryPoolManager::newPool(S32 type) void LLPrivateMemoryPoolManager::deletePool(LLPrivateMemoryPool* pool) { - if(pool->isEmpty()) + if(pool && pool->isEmpty()) { mPoolList[pool->getType()] = NULL ; delete pool; @@ -1907,7 +1918,7 @@ char* LLPrivateMemoryPoolManager::allocate(LLPrivateMemoryPool* poolp, U32 size, { p = poolp->allocate(size) ; } - + if(p) { char num[16] ; @@ -1924,18 +1935,14 @@ char* LLPrivateMemoryPoolManager::allocate(LLPrivateMemoryPool* poolp, U32 size, //static char* LLPrivateMemoryPoolManager::allocate(LLPrivateMemoryPool* poolp, U32 size) { -#if _USE_PRIVATE_MEM_POOL_ - if(!poolp) + if(poolp) { - return (char*)malloc(size) ; + return poolp->allocate(size) ; } else { - return poolp->allocate(size) ; + return (char*)malloc(size) ; } -#else - return (char*)malloc(size) ; -#endif } #endif @@ -1951,7 +1958,6 @@ void LLPrivateMemoryPoolManager::freeMem(LLPrivateMemoryPool* poolp, void* addr sMemAllocationTracker.erase((char*)addr) ; #endif -#if _USE_PRIVATE_MEM_POOL_ if(poolp) { poolp->freeMem(addr) ; @@ -1959,10 +1965,7 @@ void LLPrivateMemoryPoolManager::freeMem(LLPrivateMemoryPool* poolp, void* addr else { free(addr) ; - } -#else - free(addr) ; -#endif + } } //-------------------------------------------------------------------- diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h index 26488423a3..f9099da612 100644 --- a/indra/llcommon/llmemory.h +++ b/indra/llcommon/llmemory.h @@ -367,11 +367,12 @@ private: class LL_COMMON_API LLPrivateMemoryPoolManager { private: - LLPrivateMemoryPoolManager() ; + LLPrivateMemoryPoolManager(BOOL enabled) ; ~LLPrivateMemoryPoolManager() ; -public: +public: static LLPrivateMemoryPoolManager* getInstance() ; + static void initClass(BOOL enabled) ; static void destroyClass() ; LLPrivateMemoryPool* newPool(S32 type) ; @@ -380,6 +381,7 @@ public: private: static LLPrivateMemoryPoolManager* sInstance ; std::vector<LLPrivateMemoryPool*> mPoolList ; + BOOL mPrivatePoolEnabled; public: //debug and statistics info. diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 8ff5341297..9c065537e5 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -5561,7 +5561,7 @@ <key>Comment</key> <string>If set, the viewer will quit to avoid crash when memory failure happens</string> <key>Persist</key> - <integer>0</integer> + <integer>1</integer> <key>Type</key> <string>Boolean</string> <key>Value</key> @@ -5578,6 +5578,17 @@ <key>Value</key> <real>600.0</real> </map> + <key>MemoryPrivatePoolEnabled</key> + <map> + <key>Comment</key> + <string>Enable the private memory pool management</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>MemProfiling</key> <map> <key>Comment</key> diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 86b34ac327..156c76e84c 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -686,6 +686,8 @@ bool LLAppViewer::init() //set the max heap size. initMaxHeapSize() ; + LLPrivateMemoryPoolManager::initClass((BOOL)gSavedSettings.getBOOL("MemoryPrivatePoolEnabled")) ; + // write Google Breakpad minidump files to our log directory std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, ""); logdir += gDirUtilp->getDirDelimiter(); |