summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--indra/llcommon/llmemory.cpp51
-rw-r--r--indra/llcommon/llmemory.h6
-rw-r--r--indra/newview/app_settings/settings.xml13
-rw-r--r--indra/newview/llappviewer.cpp2
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();