diff --git a/indra/llcommon/llmemory.cpp b/indra/llcommon/llmemory.cpp
index 049e9626381b5bd5deaf65a76a48ea78770437a3..b3debf35506c06cb8504afd94a0b49681bc0a523 100644
--- a/indra/llcommon/llmemory.cpp
+++ b/indra/llcommon/llmemory.cpp
@@ -57,10 +57,6 @@ U32Kilobytes LLMemory::sAllocatedPageSizeInKB(0);
 U32Kilobytes LLMemory::sMaxHeapSizeInKB(U32_MAX);
 BOOL LLMemory::sEnableMemoryFailurePrevention = FALSE;
 
-#if __DEBUG_PRIVATE_MEM__
-LLPrivateMemoryPoolManager::mem_allocation_info_t LLPrivateMemoryPoolManager::sMemAllocationTracker;
-#endif
-
 void ll_assert_aligned_func(uintptr_t ptr,U32 alignment)
 {
 #if defined(LL_WINDOWS) && defined(LL_DEBUG_BUFFER_OVERRUN)
@@ -154,17 +150,12 @@ void LLMemory::logMemoryInfo(BOOL update)
 	if(update)
 	{
 		updateMemoryInfo() ;
-		LLPrivateMemoryPoolManager::getInstance()->updateStatistics() ;
 	}
 
 	LL_INFOS() << "Current allocated physical memory(KB): " << sAllocatedMemInKB << LL_ENDL ;
 	LL_INFOS() << "Current allocated page size (KB): " << sAllocatedPageSizeInKB << LL_ENDL ;
 	LL_INFOS() << "Current available physical memory(KB): " << sAvailPhysicalMemInKB << LL_ENDL ;
 	LL_INFOS() << "Current max usable memory(KB): " << sMaxPhysicalMemInKB << LL_ENDL ;
-
-	LL_INFOS() << "--- private pool information -- " << LL_ENDL ;
-	LL_INFOS() << "Total reserved (KB): " << LLPrivateMemoryPoolManager::getInstance()->mTotalReservedSize / 1024 << LL_ENDL ;
-	LL_INFOS() << "Total allocated (KB): " << LLPrivateMemoryPoolManager::getInstance()->mTotalAllocatedSize / 1024 << LL_ENDL ;
 }
 
 //return 0: everything is normal;
@@ -356,1729 +347,6 @@ U64 LLMemory::getCurrentRSS()
 
 #endif
 
-//--------------------------------------------------------------------------------------------------
-//--------------------------------------------------------------------------------------------------
-//minimum slot size and minimal slot size interval
-const U32 ATOMIC_MEM_SLOT = 16 ; //bytes
-
-//minimum block sizes (page size) for small allocation, medium allocation, large allocation 
-const U32 MIN_BLOCK_SIZES[LLPrivateMemoryPool::SUPER_ALLOCATION] = {2 << 10, 4 << 10, 16 << 10} ; //
-
-//maximum block sizes for small allocation, medium allocation, large allocation 
-const U32 MAX_BLOCK_SIZES[LLPrivateMemoryPool::SUPER_ALLOCATION] = {64 << 10, 1 << 20, 4 << 20} ;
-
-//minimum slot sizes for small allocation, medium allocation, large allocation 
-const U32 MIN_SLOT_SIZES[LLPrivateMemoryPool::SUPER_ALLOCATION]  = {ATOMIC_MEM_SLOT, 2 << 10, 512 << 10};
-
-//maximum slot sizes for small allocation, medium allocation, large allocation 
-const U32 MAX_SLOT_SIZES[LLPrivateMemoryPool::SUPER_ALLOCATION]  = {(2 << 10) - ATOMIC_MEM_SLOT, (512 - 2) << 10, 4 << 20};
-
-//size of a block with multiple slots can not exceed CUT_OFF_SIZE
-const U32 CUT_OFF_SIZE = (64 << 10) ; //64 KB
-
-//max number of slots in a block
-const U32 MAX_NUM_SLOTS_IN_A_BLOCK = llmin(MIN_BLOCK_SIZES[0] / ATOMIC_MEM_SLOT, ATOMIC_MEM_SLOT * 8) ;
-
-//-------------------------------------------------------------
-//align val to be integer times of ATOMIC_MEM_SLOT
-U32 align(U32 val)
-{
-	U32 aligned = (val / ATOMIC_MEM_SLOT) * ATOMIC_MEM_SLOT ;
-	if(aligned < val)
-	{
-		aligned += ATOMIC_MEM_SLOT ;
-	}
-
-	return aligned ;
-}
-
-//-------------------------------------------------------------
-//class LLPrivateMemoryPool::LLMemoryBlock
-//-------------------------------------------------------------
-//
-//each memory block could fit for two page sizes: 0.75 * mSlotSize, which starts from the beginning of the memory chunk and grow towards the end of the
-//the block; another is mSlotSize, which starts from the end of the block and grows towards the beginning of the block.
-//
-LLPrivateMemoryPool::LLMemoryBlock::LLMemoryBlock()
-{
-	//empty
-}
-		
-LLPrivateMemoryPool::LLMemoryBlock::~LLMemoryBlock() 
-{
-	//empty
-}
-
-//create and initialize a memory block
-void LLPrivateMemoryPool::LLMemoryBlock::init(char* buffer, U32 buffer_size, U32 slot_size)
-{
-	mBuffer = buffer ;
-	mBufferSize = buffer_size ;
-	mSlotSize = slot_size ;
-	mTotalSlots = buffer_size / mSlotSize ;	
-	
-	llassert_always(buffer_size / mSlotSize <= MAX_NUM_SLOTS_IN_A_BLOCK) ; //max number is 128
-	
-	mAllocatedSlots = 0 ;
-	mDummySize = 0 ;
-
-	//init the bit map.
-	//mark free bits	
-	if(mTotalSlots > 32) //reserve extra space from mBuffer to store bitmap if needed.
-	{
-		mDummySize = ATOMIC_MEM_SLOT ;		
-		mTotalSlots -= (mDummySize + mSlotSize - 1) / mSlotSize ;
-		mUsageBits = 0 ;
-
-		S32 usage_bit_len = (mTotalSlots + 31) / 32 ;
-		
-		for(S32 i = 0 ; i < usage_bit_len - 1 ; i++)
-		{
-			*((U32*)mBuffer + i) = 0 ;
-		}
-		for(S32 i = usage_bit_len - 1 ; i < mDummySize / sizeof(U32) ; i++)
-		{
-			*((U32*)mBuffer + i) = 0xffffffff ;
-		}
-
-		if(mTotalSlots & 31)
-		{
-			*((U32*)mBuffer + usage_bit_len - 2) = (0xffffffff << (mTotalSlots & 31)) ;
-		}		
-	}	
-	else//no extra bitmap space reserved
-	{
-		mUsageBits = 0 ;
-		if(mTotalSlots & 31)
-		{
-			mUsageBits = (0xffffffff << (mTotalSlots & 31)) ;
-		}
-	}
-
-	mSelf = this ;
-	mNext = NULL ;
-	mPrev = NULL ;
-
-	llassert_always(mTotalSlots > 0) ;
-}
-
-//mark this block to be free with the memory [mBuffer, mBuffer + mBufferSize).
-void LLPrivateMemoryPool::LLMemoryBlock::setBuffer(char* buffer, U32 buffer_size)
-{
-	mBuffer = buffer ;
-	mBufferSize = buffer_size ;
-	mSelf = NULL ;
-	mTotalSlots = 0 ; //set the block is free.
-}
-
-//reserve a slot
-char* LLPrivateMemoryPool::LLMemoryBlock::allocate() 
-{
-	llassert_always(mAllocatedSlots < mTotalSlots) ;
-	
-	//find a free slot
-	U32* bits = NULL ;
-	U32  k = 0 ;
-	if(mUsageBits != 0xffffffff)
-	{
-		bits = &mUsageBits ;
-	}
-	else if(mDummySize > 0)//go to extra space
-	{		
-		for(S32 i = 0 ; i < mDummySize / sizeof(U32); i++)
-		{
-			if(*((U32*)mBuffer + i) != 0xffffffff)
-			{
-				bits = (U32*)mBuffer + i ;
-				k = i + 1 ;
-				break ;
-			}
-		}
-	}	
-	S32 idx = 0 ;
-	U32 tmp = *bits ;
-	for(; tmp & 1 ; tmp >>= 1, idx++) ;
-
-	//set the slot reserved
-	if(!idx)
-	{
-		*bits |= 1 ;
-	}
-	else
-	{
-		*bits |= (1 << idx) ;
-	}
-
-	mAllocatedSlots++ ;
-	
-	return mBuffer + mDummySize + (k * 32 + idx) * mSlotSize ;
-}
-
-//free a slot
-void  LLPrivateMemoryPool::LLMemoryBlock::freeMem(void* addr) 
-{
-	//bit index
-	uintptr_t idx = ((uintptr_t)addr - (uintptr_t)mBuffer - mDummySize) / mSlotSize ;
-
-	U32* bits = &mUsageBits ;
-	if(idx >= 32)
-	{
-		bits = (U32*)mBuffer + (idx - 32) / 32 ;
-	}
-
-	//reset the bit
-	if(idx & 31)
-	{
-		*bits &= ~(1 << (idx & 31)) ;
-	}
-	else
-	{
-		*bits &= ~1 ;
-	}
-
-	mAllocatedSlots-- ;
-}
-
-//for debug use: reset the entire bitmap.
-void  LLPrivateMemoryPool::LLMemoryBlock::resetBitMap()
-{
-	for(S32 i = 0 ; i < mDummySize / sizeof(U32) ; i++)
-	{
-		*((U32*)mBuffer + i) = 0 ;
-	}
-	mUsageBits = 0 ;
-}
-//-------------------------------------------------------------------
-//class LLMemoryChunk
-//--------------------------------------------------------------------
-LLPrivateMemoryPool::LLMemoryChunk::LLMemoryChunk()
-{
-	//empty
-}
-
-LLPrivateMemoryPool::LLMemoryChunk::~LLMemoryChunk()
-{
-	//empty
-}
-
-//create and init a memory chunk
-void LLPrivateMemoryPool::LLMemoryChunk::init(char* buffer, U32 buffer_size, U32 min_slot_size, U32 max_slot_size, U32 min_block_size, U32 max_block_size) 
-{
-	mBuffer = buffer ;
-	mBufferSize = buffer_size ;
-	mAlloatedSize = 0 ;
-
-	mMetaBuffer = mBuffer + sizeof(LLMemoryChunk) ;
-
-	mMinBlockSize = min_block_size; //page size
-	mMinSlotSize = min_slot_size;
-	mMaxSlotSize = max_slot_size ;
-	mBlockLevels = mMaxSlotSize / mMinSlotSize ;
-	mPartitionLevels = max_block_size / mMinBlockSize + 1 ;
-
-	S32 max_num_blocks = (buffer_size - sizeof(LLMemoryChunk) - mBlockLevels * sizeof(LLMemoryBlock*) - mPartitionLevels * sizeof(LLMemoryBlock*)) / 
-		                 (mMinBlockSize + sizeof(LLMemoryBlock)) ;
-	//meta data space
-	mBlocks = (LLMemoryBlock*)mMetaBuffer ; //space reserved for all memory blocks.
-	mAvailBlockList = (LLMemoryBlock**)((char*)mBlocks + sizeof(LLMemoryBlock) * max_num_blocks) ; 
-	mFreeSpaceList = (LLMemoryBlock**)((char*)mAvailBlockList + sizeof(LLMemoryBlock*) * mBlockLevels) ; 
-	
-	//data buffer, which can be used for allocation
-	mDataBuffer = (char*)mFreeSpaceList + sizeof(LLMemoryBlock*) * mPartitionLevels ;
-	
-	//alignmnet
-	mDataBuffer = mBuffer + align(mDataBuffer - mBuffer) ;
-	
-	//init
-	for(U32 i = 0 ; i < mBlockLevels; i++)
-	{
-		mAvailBlockList[i] = NULL ;
-	}
-	for(U32 i = 0 ; i < mPartitionLevels ; i++)
-	{
-		mFreeSpaceList[i] = NULL ;
-	}
-
-	//assign the entire chunk to the first block
-	mBlocks[0].mPrev = NULL ;
-	mBlocks[0].mNext = NULL ;
-	mBlocks[0].setBuffer(mDataBuffer, buffer_size - (mDataBuffer - mBuffer)) ;
-	addToFreeSpace(&mBlocks[0]) ;
-
-	mNext = NULL ;
-	mPrev = NULL ;
-}
-
-//static 
-U32 LLPrivateMemoryPool::LLMemoryChunk::getMaxOverhead(U32 data_buffer_size, U32 min_slot_size, 
-													   U32 max_slot_size, U32 min_block_size, U32 max_block_size)
-{
-	//for large allocations, reserve some extra memory for meta data to avoid wasting much 
-	if(data_buffer_size / min_slot_size < 64) //large allocations
-	{
-		U32 overhead = sizeof(LLMemoryChunk) + (data_buffer_size / min_block_size) * sizeof(LLMemoryBlock) +
-			sizeof(LLMemoryBlock*) * (max_slot_size / min_slot_size) + sizeof(LLMemoryBlock*) * (max_block_size / min_block_size + 1) ;
-
-		//round to integer times of min_block_size
-		overhead = ((overhead + min_block_size - 1) / min_block_size) * min_block_size ;
-		return overhead ;
-	}
-	else
-	{
-		return 0 ; //do not reserve extra overhead if for small allocations
-	}
-}
-
-char* LLPrivateMemoryPool::LLMemoryChunk::allocate(U32 size)
-{
-	if(mMinSlotSize > size)
-	{
-		size = mMinSlotSize ;
-	}
-	if(mAlloatedSize + size  > mBufferSize - (mDataBuffer - mBuffer))
-	{
-		return NULL ; //no enough space in this chunk.
-	}
-
-	char* p = NULL ;
-	U32 blk_idx = getBlockLevel(size);
-
-	LLMemoryBlock* blk = NULL ;
-
-	//check if there is free block available
-	if(mAvailBlockList[blk_idx])
-	{
-		blk = mAvailBlockList[blk_idx] ;
-		p = blk->allocate() ;
-		
-		if(blk->isFull())
-		{
-			popAvailBlockList(blk_idx) ;
-		}
-	}
-
-	//ask for a new block
-	if(!p)
-	{
-		blk = addBlock(blk_idx) ;
-		if(blk)
-		{
-			p = blk->allocate() ;
-
-			if(blk->isFull())
-			{
-				popAvailBlockList(blk_idx) ;
-			}
-		}
-	}
-
-	//ask for space from larger blocks
-	if(!p)
-	{
-		for(S32 i = blk_idx + 1 ; i < mBlockLevels; i++)
-		{
-			if(mAvailBlockList[i])
-			{
-				blk = mAvailBlockList[i] ;
-				p = blk->allocate() ;
-
-				if(blk->isFull())
-				{
-					popAvailBlockList(i) ;
-				}
-				break ;
-			}
-		}
-	}
-
-	if(p && blk)
-	{		
-		mAlloatedSize += blk->getSlotSize() ;
-	}
-	return p ;
-}
-
-void LLPrivateMemoryPool::LLMemoryChunk::freeMem(void* addr)
-{	
-	U32 blk_idx = getPageIndex((uintptr_t)addr) ;
-	LLMemoryBlock* blk = (LLMemoryBlock*)(mMetaBuffer + blk_idx * sizeof(LLMemoryBlock)) ;
-	blk = blk->mSelf ;
-
-	bool was_full = blk->isFull() ;
-	blk->freeMem(addr) ;
-	mAlloatedSize -= blk->getSlotSize() ;
-
-	if(blk->empty())
-	{
-		removeBlock(blk) ;
-	}
-	else if(was_full)
-	{
-		addToAvailBlockList(blk) ;
-	}	
-}
-
-bool LLPrivateMemoryPool::LLMemoryChunk::empty()
-{
-	return !mAlloatedSize ;
-}
-
-bool LLPrivateMemoryPool::LLMemoryChunk::containsAddress(const char* addr) const
-{
-	return (uintptr_t)mBuffer <= (uintptr_t)addr && (uintptr_t)mBuffer + mBufferSize > (uintptr_t)addr ;
-}
-
-//debug use
-void LLPrivateMemoryPool::LLMemoryChunk::dump()
-{
-#if 0
-	//sanity check
-	//for(S32 i = 0 ; i < mBlockLevels ; i++)
-	//{
-	//	LLMemoryBlock* blk = mAvailBlockList[i] ;
-	//	while(blk)
-	//	{
-	//		blk_list.push_back(blk) ;
-	//		blk = blk->mNext ;
-	//	}
-	//}
-	for(S32 i = 0 ; i < mPartitionLevels ; i++)
-	{
-		LLMemoryBlock* blk = mFreeSpaceList[i] ;
-		while(blk)
-		{
-			blk_list.push_back(blk) ;
-			blk = blk->mNext ;
-		}
-	}
-
-	std::sort(blk_list.begin(), blk_list.end(), LLMemoryBlock::CompareAddress());
-
-	U32 total_size = blk_list[0]->getBufferSize() ;
-	for(U32 i = 1 ; i < blk_list.size(); i++)
-	{
-		total_size += blk_list[i]->getBufferSize() ;
-		if((uintptr_t)blk_list[i]->getBuffer() < (uintptr_t)blk_list[i-1]->getBuffer() + blk_list[i-1]->getBufferSize())
-		{
-			LL_ERRS() << "buffer corrupted." << LL_ENDL ;
-		}
-	}
-
-	llassert_always(total_size + mMinBlockSize >= mBufferSize - ((uintptr_t)mDataBuffer - (uintptr_t)mBuffer)) ;
-
-	U32 blk_num = (mBufferSize - (mDataBuffer - mBuffer)) / mMinBlockSize ;
-	for(U32 i = 0 ; i < blk_num ; )
-	{
-		LLMemoryBlock* blk = &mBlocks[i] ;
-		if(blk->mSelf)
-		{
-			U32 end = blk->getBufferSize() / mMinBlockSize ;
-			for(U32 j = 0 ; j < end ; j++)
-			{
-				llassert_always(blk->mSelf == blk || !blk->mSelf) ;
-			}
-			i += end ;
-		}
-		else
-		{
-			LL_ERRS() << "gap happens" << LL_ENDL ;
-		}
-	}
-#endif
-#if 0
-	LL_INFOS() << "---------------------------" << LL_ENDL ;
-	LL_INFOS() << "Chunk buffer: " << (uintptr_t)getBuffer() << " size: " << getBufferSize() << LL_ENDL ;
-
-	LL_INFOS() << "available blocks ... " << LL_ENDL ;
-	for(S32 i = 0 ; i < mBlockLevels ; i++)
-	{
-		LLMemoryBlock* blk = mAvailBlockList[i] ;
-		while(blk)
-		{
-			LL_INFOS() << "blk buffer " << (uintptr_t)blk->getBuffer() << " size: " << blk->getBufferSize() << LL_ENDL ;
-			blk = blk->mNext ;
-		}
-	}
-
-	LL_INFOS() << "free blocks ... " << LL_ENDL ;
-	for(S32 i = 0 ; i < mPartitionLevels ; i++)
-	{
-		LLMemoryBlock* blk = mFreeSpaceList[i] ;
-		while(blk)
-		{
-			LL_INFOS() << "blk buffer " << (uintptr_t)blk->getBuffer() << " size: " << blk->getBufferSize() << LL_ENDL ;
-			blk = blk->mNext ;
-		}
-	}
-#endif
-}
-
-//compute the size for a block, the size is round to integer times of mMinBlockSize.
-U32 LLPrivateMemoryPool::LLMemoryChunk::calcBlockSize(U32 slot_size)
-{
-	//
-	//Note: we try to make a block to have 32 slots if the size is not over 32 pages
-	//32 is the number of bits of an integer in a 32-bit system
-	//
-
-	U32 block_size;
-	U32 cut_off_size = llmin(CUT_OFF_SIZE, (U32)(mMinBlockSize << 5)) ;
-
-	if((slot_size << 5) <= mMinBlockSize)//for small allocations, return one page 
-	{
-		block_size = mMinBlockSize ;
-	}
-	else if(slot_size >= cut_off_size)//for large allocations, return one-slot block
-	{
-		block_size = (slot_size / mMinBlockSize) * mMinBlockSize ;
-		if(block_size < slot_size)
-		{
-			block_size += mMinBlockSize ;
-		}
-	}
-	else //medium allocations
-	{
-		if((slot_size << 5) >= cut_off_size)
-		{
-			block_size = cut_off_size ;
-		}
-		else
-		{
-			block_size = ((slot_size << 5) / mMinBlockSize) * mMinBlockSize ;
-		}
-	}
-
-	llassert_always(block_size >= slot_size) ;
-
-	return block_size ;
-}
-
-//create a new block in the chunk
-LLPrivateMemoryPool::LLMemoryBlock* LLPrivateMemoryPool::LLMemoryChunk::addBlock(U32 blk_idx)
-{	
-	U32 slot_size = mMinSlotSize * (blk_idx + 1) ;
-	U32 preferred_block_size = calcBlockSize(slot_size) ;	
-	U16 idx = getPageLevel(preferred_block_size); 
-	LLMemoryBlock* blk = NULL ;
-	
-	if(mFreeSpaceList[idx])//if there is free slot for blk_idx
-	{
-		blk = createNewBlock(mFreeSpaceList[idx], preferred_block_size, slot_size, blk_idx) ;
-	}
-	else if(mFreeSpaceList[mPartitionLevels - 1]) //search free pool
-	{		
-		blk = createNewBlock(mFreeSpaceList[mPartitionLevels - 1], preferred_block_size, slot_size, blk_idx) ;
-	}
-	else //search for other non-preferred but enough space slot.
-	{
-		S32 min_idx = 0 ;
-		if(slot_size > mMinBlockSize)
-		{
-			min_idx = getPageLevel(slot_size) ;
-		}
-		for(S32 i = (S32)idx - 1 ; i >= min_idx ; i--) //search the small slots first
-		{
-			if(mFreeSpaceList[i])
-			{
-				U32 new_preferred_block_size = mFreeSpaceList[i]->getBufferSize();
-				new_preferred_block_size = (new_preferred_block_size / mMinBlockSize) * mMinBlockSize ; //round to integer times of mMinBlockSize.
-
-				//create a NEW BLOCK THERE.
-				if(new_preferred_block_size >= slot_size) //at least there is space for one slot.
-				{
-					
-					blk = createNewBlock(mFreeSpaceList[i], new_preferred_block_size, slot_size, blk_idx) ;
-				}
-				break ;
-			} 
-		}
-
-		if(!blk)
-		{
-			for(U16 i = idx + 1 ; i < mPartitionLevels - 1; i++) //search the large slots 
-			{
-				if(mFreeSpaceList[i])
-				{
-					//create a NEW BLOCK THERE.
-					blk = createNewBlock(mFreeSpaceList[i], preferred_block_size, slot_size, blk_idx) ;
-					break ;
-				} 
-			}
-		}
-	}
-
-	return blk ;
-}
-
-//create a new block at the designed location
-LLPrivateMemoryPool::LLMemoryBlock* LLPrivateMemoryPool::LLMemoryChunk::createNewBlock(LLMemoryBlock* blk, U32 buffer_size, U32 slot_size, U32 blk_idx)
-{
-	//unlink from the free space
-	removeFromFreeSpace(blk) ;
-
-	//check the rest space
-	U32 new_free_blk_size = blk->getBufferSize() - buffer_size ;	
-	if(new_free_blk_size < mMinBlockSize) //can not partition the memory into size smaller than mMinBlockSize
-	{
-		new_free_blk_size = 0 ; //discard the last small extra space.
-	}			
-
-	//add the rest space back to the free list
-	if(new_free_blk_size > 0) //blk still has free space
-	{
-		LLMemoryBlock* next_blk = blk + (buffer_size / mMinBlockSize) ;
-		next_blk->mPrev = NULL ;
-		next_blk->mNext = NULL ;
-		next_blk->setBuffer(blk->getBuffer() + buffer_size, new_free_blk_size) ;
-		addToFreeSpace(next_blk) ;
-	}
-
-	blk->init(blk->getBuffer(), buffer_size, slot_size) ;
-	//insert to the available block list...
-	mAvailBlockList[blk_idx] = blk ;
-
-	//mark the address map: all blocks covered by this block space pointing back to this block.
-	U32 end = (buffer_size / mMinBlockSize) ;
-	for(U32 i = 1 ; i < end ; i++)
-	{
-		(blk + i)->mSelf = blk ;
-	}
-
-	return blk ;
-}
-
-//delete a block, release the block to the free pool.
-void LLPrivateMemoryPool::LLMemoryChunk::removeBlock(LLMemoryBlock* blk)
-{
-	//remove from the available block list
-	if(blk->mPrev)
-	{
-		blk->mPrev->mNext = blk->mNext ;
-	}
-	if(blk->mNext)
-	{
-		blk->mNext->mPrev = blk->mPrev ;
-	}
-	U32 blk_idx = getBlockLevel(blk->getSlotSize());
-	if(mAvailBlockList[blk_idx] == blk)
-	{
-		mAvailBlockList[blk_idx] = blk->mNext ;
-	}
-
-	blk->mNext = NULL ;
-	blk->mPrev = NULL ;
-	
-	//mark it free
-	blk->setBuffer(blk->getBuffer(), blk->getBufferSize()) ;
-
-#if 1
-	//merge blk with neighbors if possible
-	if(blk->getBuffer() > mDataBuffer) //has the left neighbor
-	{
-		if((blk - 1)->mSelf->isFree())
-		{
-			LLMemoryBlock* left_blk = (blk - 1)->mSelf ;
-			removeFromFreeSpace((blk - 1)->mSelf);
-			left_blk->setBuffer(left_blk->getBuffer(), left_blk->getBufferSize() + blk->getBufferSize()) ;
-			blk = left_blk ;
-		}
-	}
-	if(blk->getBuffer() + blk->getBufferSize() <= mBuffer + mBufferSize - mMinBlockSize) //has the right neighbor
-	{
-		U32 d = blk->getBufferSize() / mMinBlockSize ;
-		if((blk + d)->isFree())
-		{
-			LLMemoryBlock* right_blk = blk + d ;
-			removeFromFreeSpace(blk + d) ;
-			blk->setBuffer(blk->getBuffer(), blk->getBufferSize() + right_blk->getBufferSize()) ;
-		}
-	}
-#endif
-	
-	addToFreeSpace(blk) ;
-
-	return ;
-}
-
-//the top block in the list is full, pop it out of the list
-void LLPrivateMemoryPool::LLMemoryChunk::popAvailBlockList(U32 blk_idx) 
-{
-	if(mAvailBlockList[blk_idx])
-	{
-		LLMemoryBlock* next = mAvailBlockList[blk_idx]->mNext ;
-		if(next)
-		{
-			next->mPrev = NULL ;
-		}
-		mAvailBlockList[blk_idx]->mPrev = NULL ;
-		mAvailBlockList[blk_idx]->mNext = NULL ;
-		mAvailBlockList[blk_idx] = next ;
-	}
-}
-
-//add the block back to the free pool
-void LLPrivateMemoryPool::LLMemoryChunk::addToFreeSpace(LLMemoryBlock* blk) 
-{
-	llassert_always(!blk->mPrev) ;
-	llassert_always(!blk->mNext) ;
-
-	U16 free_idx = blk->getBufferSize() / mMinBlockSize - 1;
-
-	(blk + free_idx)->mSelf = blk ; //mark the end pointing back to the head.
-	free_idx = llmin(free_idx, (U16)(mPartitionLevels - 1)) ;
-
-	blk->mNext = mFreeSpaceList[free_idx] ;
-	if(mFreeSpaceList[free_idx])
-	{
-		mFreeSpaceList[free_idx]->mPrev = blk ;
-	}
-	mFreeSpaceList[free_idx] = blk ;
-	blk->mPrev = NULL ;
-	blk->mSelf = blk ;
-	
-	return ;
-}
-
-//remove the space from the free pool
-void LLPrivateMemoryPool::LLMemoryChunk::removeFromFreeSpace(LLMemoryBlock* blk) 
-{
-	U16 free_idx = blk->getBufferSize() / mMinBlockSize - 1;
-	free_idx = llmin(free_idx, (U16)(mPartitionLevels - 1)) ;
-
-	if(mFreeSpaceList[free_idx] == blk)
-	{
-		mFreeSpaceList[free_idx] = blk->mNext ;
-	}
-	if(blk->mPrev)
-	{
-		blk->mPrev->mNext = blk->mNext ;
-	}
-	if(blk->mNext)
-	{
-		blk->mNext->mPrev = blk->mPrev ;
-	}
-	blk->mNext = NULL ;
-	blk->mPrev = NULL ;
-	blk->mSelf = NULL ;
-
-	return ;
-}
-
-void LLPrivateMemoryPool::LLMemoryChunk::addToAvailBlockList(LLMemoryBlock* blk) 
-{
-	llassert_always(!blk->mPrev) ;
-	llassert_always(!blk->mNext) ;
-
-	U32 blk_idx = getBlockLevel(blk->getSlotSize());
-
-	blk->mNext = mAvailBlockList[blk_idx] ;
-	if(blk->mNext)
-	{
-		blk->mNext->mPrev = blk ;
-	}
-	blk->mPrev = NULL ;
-	mAvailBlockList[blk_idx] = blk ;
-
-	return ;
-}
-
-U32 LLPrivateMemoryPool::LLMemoryChunk::getPageIndex(uintptr_t addr)
-{
-	return (addr - (uintptr_t)mDataBuffer) / mMinBlockSize ;
-}
-
-//for mAvailBlockList
-U32 LLPrivateMemoryPool::LLMemoryChunk::getBlockLevel(U32 size)
-{
-	llassert(size >= mMinSlotSize && size <= mMaxSlotSize) ;
-
-	//start from 0
-	return (size + mMinSlotSize - 1) / mMinSlotSize - 1 ;
-}
-
-//for mFreeSpaceList
-U16 LLPrivateMemoryPool::LLMemoryChunk::getPageLevel(U32 size)
-{
-	//start from 0
-	U16 level = size / mMinBlockSize - 1 ;
-	if(level >= mPartitionLevels)
-	{
-		level = mPartitionLevels - 1 ;
-	}
-	return level ;
-}
-
-//-------------------------------------------------------------------
-//class LLPrivateMemoryPool
-//--------------------------------------------------------------------
-const U32 CHUNK_SIZE = 4 << 20 ; //4 MB
-const U32 LARGE_CHUNK_SIZE = 4 * CHUNK_SIZE ; //16 MB
-LLPrivateMemoryPool::LLPrivateMemoryPool(S32 type, U32 max_pool_size) :
-	mMutexp(NULL),	
-	mReservedPoolSize(0),
-	mHashFactor(1),
-	mType(type),
-	mMaxPoolSize(max_pool_size)
-{
-	if(type == STATIC_THREADED || type == VOLATILE_THREADED)
-	{
-		mMutexp = new LLMutex(NULL) ;
-	}
-
-	for(S32 i = 0 ; i < SUPER_ALLOCATION ; i++)
-	{
-		mChunkList[i] = NULL ;
-	}	
-	
-	mNumOfChunks = 0 ;
-}
-
-LLPrivateMemoryPool::~LLPrivateMemoryPool()
-{
-	destroyPool();
-	delete mMutexp ;
-}
-
-char* LLPrivateMemoryPool::allocate(U32 size)
-{	
-	if(!size)
-	{
-		return NULL ;
-	}
-
-	//if the asked size larger than MAX_BLOCK_SIZE, fetch from heap directly, the pool does not manage it
-	if(size >= CHUNK_SIZE)
-	{
-		return (char*)ll_aligned_malloc_16(size) ;
-	}
-
-	char* p = NULL ;
-
-	//find the appropriate chunk
-	S32 chunk_idx = getChunkIndex(size) ;
-	
-	lock() ;
-
-	LLMemoryChunk* chunk = mChunkList[chunk_idx];
-	while(chunk)
-	{
-		if((p = chunk->allocate(size)))
-		{
-			break ;
-		}
-		chunk = chunk->mNext ;
-	}
-	
-	//fetch new memory chunk
-	if(!p)
-	{
-		if(mReservedPoolSize + CHUNK_SIZE > mMaxPoolSize)
-		{
-			chunk = mChunkList[chunk_idx];
-			while(chunk)
-			{
-				if((p = chunk->allocate(size)))
-				{
-					break ;
-				}
-				chunk = chunk->mNext ;
-			}
-		}
-		else
-		{
-			chunk = addChunk(chunk_idx) ;
-			if(chunk)
-			{
-				p = chunk->allocate(size) ;
-			}
-		}
-	}
-
-	unlock() ;
-
-	if(!p) //to get memory from the private pool failed, try the heap directly
-	{
-		static bool to_log = true ;
-		
-		if(to_log)
-		{
-			LL_WARNS() << "The memory pool overflows, now using heap directly!" << LL_ENDL ;
-			to_log = false ;
-		}
-
-		return (char*)ll_aligned_malloc_16(size) ;
-	}
-
-	return p ;
-}
-
-void LLPrivateMemoryPool::freeMem(void* addr)
-{
-	if(!addr)
-	{
-		return ;
-	}
-	
-	lock() ;
-	
-	LLMemoryChunk* chunk = findChunk((char*)addr) ;
-	
-	if(!chunk)
-	{
-		ll_aligned_free_16(addr) ; //release from heap
-	}
-	else
-	{
-		chunk->freeMem(addr) ;
-
-		if(chunk->empty())
-		{
-			removeChunk(chunk) ;
-		}
-	}
-	
-	unlock() ;
-}
-
-void LLPrivateMemoryPool::dump()
-{
-}
-
-U32 LLPrivateMemoryPool::getTotalAllocatedSize()
-{
-	U32 total_allocated = 0 ;
-
-	LLMemoryChunk* chunk ;
-	for(S32 i = 0 ; i < SUPER_ALLOCATION ; i++)
-	{
-		chunk = mChunkList[i];
-		while(chunk)
-		{
-			total_allocated += chunk->getAllocatedSize() ;
-			chunk = chunk->mNext ;
-		}
-	}
-
-	return total_allocated ;
-}
-
-void LLPrivateMemoryPool::lock()
-{
-	if(mMutexp)
-	{
-		mMutexp->lock() ;
-	}
-}
-
-void LLPrivateMemoryPool::unlock()
-{
-	if(mMutexp)
-	{
-		mMutexp->unlock() ;
-	}
-}
-
-S32  LLPrivateMemoryPool::getChunkIndex(U32 size) 
-{
-	S32 i ;
-	for(i = 0 ; size > MAX_SLOT_SIZES[i]; i++);
-	
-	llassert_always(i < SUPER_ALLOCATION);
-
-	return i ;
-}
-
-//destroy the entire pool
-void  LLPrivateMemoryPool::destroyPool()
-{
-	lock() ;
-
-	if(mNumOfChunks > 0)
-	{
-		LL_WARNS() << "There is some memory not freed when destroy the memory pool!" << LL_ENDL ;
-	}
-
-	mNumOfChunks = 0 ;
-	mChunkHashList.clear() ;
-	mHashFactor = 1 ;
-	for(S32 i = 0 ; i < SUPER_ALLOCATION ; i++)
-	{
-		mChunkList[i] = NULL ;
-	}
-
-	unlock() ;
-}
-
-bool LLPrivateMemoryPool::checkSize(U32 asked_size)
-{
-	if(mReservedPoolSize + asked_size > mMaxPoolSize)
-	{
-		LL_INFOS() << "Max pool size: " << mMaxPoolSize << LL_ENDL ;
-		LL_INFOS() << "Total reserved size: " << mReservedPoolSize + asked_size << LL_ENDL ;
-		LL_INFOS() << "Total_allocated Size: " << getTotalAllocatedSize() << LL_ENDL ;
-
-		//LL_ERRS() << "The pool is overflowing..." << LL_ENDL ;
-
-		return false ;
-	}
-
-	return true ;
-}
-
-LLPrivateMemoryPool::LLMemoryChunk* LLPrivateMemoryPool::addChunk(S32 chunk_index)
-{
-	U32 preferred_size ;
-	U32 overhead ;
-	if(chunk_index < LARGE_ALLOCATION)
-	{
-		preferred_size = CHUNK_SIZE ; //4MB
-		overhead = LLMemoryChunk::getMaxOverhead(preferred_size, MIN_SLOT_SIZES[chunk_index],
-			MAX_SLOT_SIZES[chunk_index], MIN_BLOCK_SIZES[chunk_index], MAX_BLOCK_SIZES[chunk_index]) ;
-	}
-	else
-	{
-		preferred_size = LARGE_CHUNK_SIZE ; //16MB
-		overhead = LLMemoryChunk::getMaxOverhead(preferred_size, MIN_SLOT_SIZES[chunk_index], 
-			MAX_SLOT_SIZES[chunk_index], MIN_BLOCK_SIZES[chunk_index], MAX_BLOCK_SIZES[chunk_index]) ;
-	}
-
-	if(!checkSize(preferred_size + overhead))
-	{
-		return NULL ;
-	}
-
-	mReservedPoolSize += preferred_size + overhead ;
-
-	char* buffer = (char*)ll_aligned_malloc_16(preferred_size + overhead) ;
-	if(!buffer)
-	{
-		return NULL ;
-	}
-	
-	LLMemoryChunk* chunk = new (buffer) LLMemoryChunk() ;
-	chunk->init(buffer, preferred_size + overhead, MIN_SLOT_SIZES[chunk_index],
-		MAX_SLOT_SIZES[chunk_index], MIN_BLOCK_SIZES[chunk_index], MAX_BLOCK_SIZES[chunk_index]) ;
-
-	//add to the tail of the linked list
-	{
-		if(!mChunkList[chunk_index])
-		{
-			mChunkList[chunk_index] = chunk ;
-		}
-		else
-		{
-			LLMemoryChunk* cur = mChunkList[chunk_index] ;
-			while(cur->mNext)
-			{
-				cur = cur->mNext ;
-			}
-			cur->mNext = chunk ;
-			chunk->mPrev = cur ;
-		}
-	}
-
-	//insert into the hash table
-	addToHashTable(chunk) ;
-	
-	mNumOfChunks++;
-
-	return chunk ;
-}
-
-void LLPrivateMemoryPool::removeChunk(LLMemoryChunk* chunk) 
-{
-	if(!chunk)
-	{
-		return ;
-	}
-
-	//remove from the linked list
-	for(S32 i = 0 ; i < SUPER_ALLOCATION ; i++)
-	{
-		if(mChunkList[i] == chunk)
-		{
-			mChunkList[i] = chunk->mNext ;
-		}
-	}
-
-	if(chunk->mPrev)
-	{
-		chunk->mPrev->mNext = chunk->mNext ;
-	}
-	if(chunk->mNext)
-	{
-		chunk->mNext->mPrev = chunk->mPrev ;
-	}
-
-	//remove from the hash table
-	removeFromHashTable(chunk) ;
-	
-	mNumOfChunks--;
-	mReservedPoolSize -= chunk->getBufferSize() ;
-	
-	//release memory
-	ll_aligned_free_16(chunk->getBuffer()) ;
-}
-
-U16 LLPrivateMemoryPool::findHashKey(const char* addr)
-{
-	return (((uintptr_t)addr) / CHUNK_SIZE) % mHashFactor ;
-}
-
-LLPrivateMemoryPool::LLMemoryChunk* LLPrivateMemoryPool::findChunk(const char* addr)
-{
-	U16 key = findHashKey(addr) ;	
-	if(mChunkHashList.size() <= key)
-	{
-		return NULL ;
-	}
-
-	return mChunkHashList[key].findChunk(addr) ;	
-}
-
-void LLPrivateMemoryPool::addToHashTable(LLMemoryChunk* chunk) 
-{
-	static const U16 HASH_FACTORS[] = {41, 83, 193, 317, 419, 523, 719, 997, 1523, 0xFFFF}; 
-	
-	U16 i ;
-	if(mChunkHashList.empty())
-	{
-		mHashFactor = HASH_FACTORS[0] ;
-		rehash() ;		
-	}
-
-	U16 start_key = findHashKey(chunk->getBuffer()) ;
-	U16 end_key = findHashKey(chunk->getBuffer() + chunk->getBufferSize() - 1) ;
-	bool need_rehash = false ;
-	
-	if(mChunkHashList[start_key].hasElement(chunk))
-	{
-		return; //already inserted.
-	}
-	need_rehash = mChunkHashList[start_key].add(chunk) ;
-	
-	if(start_key == end_key && !need_rehash)
-	{
-		return ; //done
-	}
-
-	if(!need_rehash)
-	{
-		need_rehash = mChunkHashList[end_key].add(chunk) ;
-	}
-
-	if(!need_rehash)
-	{
-		if(end_key < start_key)
-		{
-			need_rehash = fillHashTable(start_key + 1, mHashFactor, chunk) ;
-			if(!need_rehash)
-			{
-				need_rehash = fillHashTable(0, end_key, chunk) ;
-			}
-		}
-		else
-		{
-			need_rehash = fillHashTable(start_key + 1, end_key, chunk) ;
-		}
-	}
-	
-	if(need_rehash)
-	{
-		i = 0 ;
-		while(HASH_FACTORS[i] <= mHashFactor) i++;
-
-		mHashFactor = HASH_FACTORS[i] ;
-		llassert_always(mHashFactor != 0xFFFF) ;//stop point to prevent endlessly recursive calls
-
-		rehash() ;
-	}
-}
-
-void LLPrivateMemoryPool::removeFromHashTable(LLMemoryChunk* chunk) 
-{
-	U16 start_key = findHashKey(chunk->getBuffer()) ;
-	U16 end_key = findHashKey(chunk->getBuffer() + chunk->getBufferSize() - 1) ;
-	
-	mChunkHashList[start_key].remove(chunk) ;
-	if(start_key == end_key)
-	{
-		return ; //done
-	}
-
-	mChunkHashList[end_key].remove(chunk) ;
-	
-	if(end_key < start_key)
-	{
-		for(U16 i = start_key + 1 ; i < mHashFactor; i++)
-		{
-			mChunkHashList[i].remove(chunk) ;
-		}
-		for(U16 i = 0 ; i < end_key; i++)
-		{
-			mChunkHashList[i].remove(chunk) ;
-		}
-	}
-	else
-	{
-		for(U16 i = start_key + 1 ; i < end_key; i++)
-		{
-			mChunkHashList[i].remove(chunk) ;
-		}
-	}
-}
-
-void LLPrivateMemoryPool::rehash()
-{
-	LL_INFOS() << "new hash factor: " << mHashFactor << LL_ENDL ;
-
-	mChunkHashList.clear() ;
-	mChunkHashList.resize(mHashFactor) ;
-
-	LLMemoryChunk* chunk ;
-	for(U16 i = 0 ; i < SUPER_ALLOCATION ; i++)
-	{
-		chunk = mChunkList[i] ; 
-		while(chunk)
-		{
-			addToHashTable(chunk) ;
-			chunk = chunk->mNext ;
-		}
-	}
-}
-
-bool LLPrivateMemoryPool::fillHashTable(U16 start, U16 end, LLMemoryChunk* chunk)
-{
-	for(U16 i = start; i < end; i++)
-	{
-		if(mChunkHashList[i].add(chunk))
-		{			
-			return true ;
-		}		
-	}
-
-	return false ;
-}
-
-//--------------------------------------------------------------------
-// class LLChunkHashElement
-//--------------------------------------------------------------------
-LLPrivateMemoryPool::LLMemoryChunk* LLPrivateMemoryPool::LLChunkHashElement::findChunk(const char* addr)
-{
-	if(mFirst && mFirst->containsAddress(addr))
-	{
-		return mFirst ;
-	}
-	else if(mSecond && mSecond->containsAddress(addr))
-	{
-		return mSecond ;
-	}
-
-	return NULL ;
-}
-
-//return false if successfully inserted to the hash slot.
-bool LLPrivateMemoryPool::LLChunkHashElement::add(LLPrivateMemoryPool::LLMemoryChunk* chunk)
-{
-	llassert_always(!hasElement(chunk)) ;
-
-	if(!mFirst)
-	{
-		mFirst = chunk ;
-	}
-	else if(!mSecond)
-	{
-		mSecond = chunk ;
-	}
-	else
-	{
-		return true ; //failed
-	}
-
-	return false ;
-}
-
-void LLPrivateMemoryPool::LLChunkHashElement::remove(LLPrivateMemoryPool::LLMemoryChunk* chunk)
-{
-	if(mFirst == chunk)
-	{
-		mFirst = NULL ;
-	}
-	else if(mSecond ==chunk)
-	{
-		mSecond = NULL ;
-	}
-	else
-	{
-		LL_ERRS() << "This slot does not contain this chunk!" << LL_ENDL ;
-	}
-}
-
-//--------------------------------------------------------------------
-//class LLPrivateMemoryPoolManager
-//--------------------------------------------------------------------
-LLPrivateMemoryPoolManager* LLPrivateMemoryPoolManager::sInstance = NULL ;
-BOOL LLPrivateMemoryPoolManager::sPrivatePoolEnabled = FALSE ;
-std::vector<LLPrivateMemoryPool*> LLPrivateMemoryPoolManager::sDanglingPoolList ;
-
-LLPrivateMemoryPoolManager::LLPrivateMemoryPoolManager(BOOL enabled, U32 max_pool_size) 
-{
-	mPoolList.resize(LLPrivateMemoryPool::MAX_TYPES) ;
-
-	for(S32 i = 0 ; i < LLPrivateMemoryPool::MAX_TYPES; i++)
-	{
-		mPoolList[i] = NULL ;
-	}
-
-	sPrivatePoolEnabled = enabled ;
-
-	const U32 MAX_POOL_SIZE = 256 * 1024 * 1024 ; //256 MB
-	mMaxPrivatePoolSize = llmax(max_pool_size, MAX_POOL_SIZE) ;
-}
-
-LLPrivateMemoryPoolManager::~LLPrivateMemoryPoolManager() 
-{
-
-#if __DEBUG_PRIVATE_MEM__
-	if(!sMemAllocationTracker.empty())
-	{
-		LL_WARNS() << "there is potential memory leaking here. The list of not freed memory blocks are from: " <<LL_ENDL ;
-
-		S32 k = 0 ;
-		for(mem_allocation_info_t::iterator iter = sMemAllocationTracker.begin() ; iter != sMemAllocationTracker.end() ; ++iter)
-		{
-			LL_INFOS() << k++ << ", " << (uintptr_t)iter->first << " : " << iter->second << LL_ENDL ;
-		}
-		sMemAllocationTracker.clear() ;
-	}
-#endif
-
-#if 0
-	//all private pools should be released by their owners before reaching here.
-	for(S32 i = 0 ; i < LLPrivateMemoryPool::MAX_TYPES; i++)
-	{
-		llassert_always(!mPoolList[i]) ;
-	}
-	mPoolList.clear() ;
-
-#else
-	//forcefully release all memory
-	for(S32 i = 0 ; i < LLPrivateMemoryPool::MAX_TYPES; i++)
-	{
-		if(mPoolList[i])
-		{
-			if(mPoolList[i]->isEmpty())
-			{
-				delete mPoolList[i] ;
-			}
-			else
-			{
-				//can not delete this pool because it has alloacted memory to be freed.
-				//move it to the dangling list.
-				sDanglingPoolList.push_back(mPoolList[i]) ;				
-			}
-
-			mPoolList[i] = NULL ;
-		}
-	}
-	mPoolList.clear() ;
-#endif
-}
-
-//static 
-void LLPrivateMemoryPoolManager::initClass(BOOL enabled, U32 max_pool_size) 
-{
-	llassert_always(!sInstance) ;
-
-	sInstance = new LLPrivateMemoryPoolManager(enabled, max_pool_size) ;
-}
-
-//static 
-LLPrivateMemoryPoolManager* LLPrivateMemoryPoolManager::getInstance() 
-{
-	//if(!sInstance)
-	//{
-	//	sInstance = new LLPrivateMemoryPoolManager(FALSE) ;
-	//}
-	return sInstance ;
-}
-	
-//static 
-void LLPrivateMemoryPoolManager::destroyClass() 
-{
-	if(sInstance)
-	{
-		delete sInstance ;
-		sInstance = NULL ;
-	}
-}
-
-LLPrivateMemoryPool* LLPrivateMemoryPoolManager::newPool(S32 type) 
-{
-	if(!sPrivatePoolEnabled)
-	{
-		return NULL ;
-	}
-
-	if(!mPoolList[type])
-	{
-		mPoolList[type] = new LLPrivateMemoryPool(type, mMaxPrivatePoolSize) ;
-	}
-
-	return mPoolList[type] ;
-}
-
-void LLPrivateMemoryPoolManager::deletePool(LLPrivateMemoryPool* pool) 
-{
-	if(pool && pool->isEmpty())
-	{
-		mPoolList[pool->getType()] = NULL ;
-		delete pool;
-	}
-}
-
-//debug
-void LLPrivateMemoryPoolManager::updateStatistics()
-{
-	mTotalReservedSize = 0 ;
-	mTotalAllocatedSize = 0 ;
-
-	for(U32 i = 0; i < mPoolList.size(); i++)
-	{
-		if(mPoolList[i])
-		{
-			mTotalReservedSize += mPoolList[i]->getTotalReservedSize() ;
-			mTotalAllocatedSize += mPoolList[i]->getTotalAllocatedSize() ;
-		}
-	}
-}
-
-#if __DEBUG_PRIVATE_MEM__
-//static 
-char* LLPrivateMemoryPoolManager::allocate(LLPrivateMemoryPool* poolp, U32 size, const char* function, const int line) 
-{
-	char* p ;
-
-	if(!poolp)
-	{
-		p = (char*)ll_aligned_malloc_16(size) ;
-	}
-	else
-	{
-		p = poolp->allocate(size) ;
-	}
-	
-	if(p)
-	{
-		char num[16] ;
-		sprintf(num, " line: %d ", line) ;
-		std::string str(function) ;
-		str += num; 
-
-		sMemAllocationTracker[p] = str ;
-	}
-
-	return p ;
-}	
-#else
-//static 
-char* LLPrivateMemoryPoolManager::allocate(LLPrivateMemoryPool* poolp, U32 size) 
-{
-	if(poolp)
-	{
-		return poolp->allocate(size) ;		
-	}
-	else
-	{
-		return (char*)ll_aligned_malloc_16(size) ;
-	}
-}
-#endif
-
-//static 
-void  LLPrivateMemoryPoolManager::freeMem(LLPrivateMemoryPool* poolp, void* addr) 
-{
-	if(!addr)
-	{
-		return ;
-	}
-
-#if __DEBUG_PRIVATE_MEM__
-	sMemAllocationTracker.erase((char*)addr) ;
-#endif
-
-	if(poolp)
-	{
-		poolp->freeMem(addr) ;
-	}
-	else
-	{
-		if(!sPrivatePoolEnabled)
-		{
-			ll_aligned_free_16(addr) ; //private pool is disabled.
-		}
-		else if(!sInstance) //the private memory manager is destroyed, try the dangling list
-		{
-			for(S32 i = 0 ; i < sDanglingPoolList.size(); i++)
-			{
-				if(sDanglingPoolList[i]->findChunk((char*)addr))
-				{
-					sDanglingPoolList[i]->freeMem(addr) ;
-					if(sDanglingPoolList[i]->isEmpty())
-					{
-						delete sDanglingPoolList[i] ;
-						
-						if(i < sDanglingPoolList.size() - 1)
-						{
-							sDanglingPoolList[i] = sDanglingPoolList[sDanglingPoolList.size() - 1] ;
-						}
-						sDanglingPoolList.pop_back() ;
-					}
-
-					addr = NULL ;
-					break ;
-				}
-			}		
-			llassert_always(!addr) ; //addr should be release before hitting here!
-		}
-		else
-		{
-			LL_ERRS() << "private pool is used before initialized.!" << LL_ENDL ;
-		}
-	}	
-}
-
-//--------------------------------------------------------------------
-//class LLPrivateMemoryPoolTester
-//--------------------------------------------------------------------
-#if 0
-LLPrivateMemoryPoolTester* LLPrivateMemoryPoolTester::sInstance = NULL ;
-LLPrivateMemoryPool* LLPrivateMemoryPoolTester::sPool = NULL ;
-LLPrivateMemoryPoolTester::LLPrivateMemoryPoolTester()
-{	
-}
-	
-LLPrivateMemoryPoolTester::~LLPrivateMemoryPoolTester() 
-{	
-}
-
-//static 
-LLPrivateMemoryPoolTester* LLPrivateMemoryPoolTester::getInstance() 
-{
-	if(!sInstance)
-	{
-		sInstance = ::new LLPrivateMemoryPoolTester() ;
-	}
-	return sInstance ;
-}
-
-//static 
-void LLPrivateMemoryPoolTester::destroy()
-{
-	if(sInstance)
-	{
-		::delete sInstance ;
-		sInstance = NULL ;
-	}
-
-	if(sPool)
-	{
-		LLPrivateMemoryPoolManager::getInstance()->deletePool(sPool) ;
-		sPool = NULL ;
-	}
-}
-
-void LLPrivateMemoryPoolTester::run(S32 type) 
-{
-	if(sPool)
-	{
-		LLPrivateMemoryPoolManager::getInstance()->deletePool(sPool) ;
-	}
-	sPool = LLPrivateMemoryPoolManager::getInstance()->newPool(type) ;
-
-	//run the test
-	correctnessTest() ;
-	performanceTest() ;
-	//fragmentationtest() ;
-
-	//release pool.
-	LLPrivateMemoryPoolManager::getInstance()->deletePool(sPool) ;
-	sPool = NULL ;
-}
-
-void LLPrivateMemoryPoolTester::test(U32 min_size, U32 max_size, U32 stride, U32 times, 
-									 bool random_deletion, bool output_statistics)
-{
-	U32 levels = (max_size - min_size) / stride + 1 ;
-	char*** p ;
-	U32 i, j ;
-	U32 total_allocated_size = 0 ;
-
-	//allocate space for p ;
-	if(!(p = ::new char**[times]) || !(*p = ::new char*[times * levels]))
-	{
-		LL_ERRS() << "memory initialization for p failed" << LL_ENDL ;
-	}
-
-	//init
-	for(i = 0 ; i < times; i++)
-	{
-		p[i] = *p + i * levels ;
-		for(j = 0 ; j < levels; j++)
-		{
-			p[i][j] = NULL ;
-		}
-	}
-
-	//allocation
-	U32 size ;
-	for(i = 0 ; i < times ; i++)
-	{
-		for(j = 0 ; j < levels; j++) 
-		{
-			size = min_size + j * stride ;
-			p[i][j] = ALLOCATE_MEM(sPool, size) ;
-
-			total_allocated_size+= size ;
-
-			*(U32*)p[i][j] = i ;
-			*((U32*)p[i][j] + 1) = j ;
-			//p[i][j][size - 1] = '\0' ; //access the last element to verify the success of the allocation.
-
-			//randomly release memory
-			if(random_deletion)
-			{
-				S32 k = rand() % levels ;
-
-				if(p[i][k])
-				{
-					llassert_always(*(U32*)p[i][k] == i && *((U32*)p[i][k] + 1) == k) ;
-					FREE_MEM(sPool, p[i][k]) ;
-					total_allocated_size -= min_size + k * stride ;
-					p[i][k] = NULL ;
-				}
-			}
-		}
-	}
-
-	//output pool allocation statistics
-	if(output_statistics)
-	{
-	}
-
-	//release all memory allocations
-	for(i = 0 ; i < times; i++)
-	{
-		for(j = 0 ; j < levels; j++)
-		{
-			if(p[i][j])
-			{
-				llassert_always(*(U32*)p[i][j] == i && *((U32*)p[i][j] + 1) == j) ;
-				FREE_MEM(sPool, p[i][j]) ;
-				total_allocated_size -= min_size + j * stride ;
-				p[i][j] = NULL ;
-			}
-		}
-	}
-
-	::delete[] *p ;
-	::delete[] p ;
-}
-
-void LLPrivateMemoryPoolTester::testAndTime(U32 size, U32 times)
-{
-	LLTimer timer ;
-
-	LL_INFOS() << " -**********************- " << LL_ENDL ;
-	LL_INFOS() << "test size: " << size << " test times: " << times << LL_ENDL ;
-
-	timer.reset() ;
-	char** p = new char*[times] ;
-		
-	//using the customized memory pool
-	//allocation
-	for(U32 i = 0 ; i < times; i++)
-	{
-		p[i] = ALLOCATE_MEM(sPool, size) ;
-		if(!p[i])
-		{
-			LL_ERRS() << "allocation failed" << LL_ENDL ;
-		}
-	}
-	//de-allocation
-	for(U32 i = 0 ; i < times; i++)
-	{
-		FREE_MEM(sPool, p[i]) ;
-		p[i] = NULL ;
-	}
-	LL_INFOS() << "time spent using customized memory pool: " << timer.getElapsedTimeF32() << LL_ENDL ;
-
-	timer.reset() ;
-
-	//using the standard allocator/de-allocator:
-	//allocation
-	for(U32 i = 0 ; i < times; i++)
-	{
-		p[i] = ::new char[size] ;
-		if(!p[i])
-		{
-			LL_ERRS() << "allocation failed" << LL_ENDL ;
-		}
-	}
-	//de-allocation
-	for(U32 i = 0 ; i < times; i++)
-	{
-		::delete[] p[i] ;
-		p[i] = NULL ;
-	}
-	LL_INFOS() << "time spent using standard allocator/de-allocator: " << timer.getElapsedTimeF32() << LL_ENDL ;
-
-	delete[] p;
-}
-
-void LLPrivateMemoryPoolTester::correctnessTest() 
-{
-	//try many different sized allocation, and all kinds of edge cases, access the allocated memory 
-	//to see if allocation is right.
-	
-	//edge case
-	char* p = ALLOCATE_MEM(sPool, 0) ;
-	FREE_MEM(sPool, p) ;
-
-	//small sized
-	// [8 bytes, 2KB), each asks for 256 allocations and deallocations
-	test(8, 2040, 8, 256, true, true) ;
-	
-	//medium sized
-	//[2KB, 512KB), each asks for 16 allocations and deallocations
-	test(2048, 512 * 1024 - 2048, 2048, 16, true, true) ;
-
-	//large sized
-	//[512KB, 4MB], each asks for 8 allocations and deallocations
-	test(512 * 1024, 4 * 1024 * 1024, 64 * 1024, 6, true, true) ;
-}
-
-void LLPrivateMemoryPoolTester::performanceTest() 
-{
-	U32 test_size[3] = {768, 3* 1024, 3* 1024 * 1024};
-	
-	//small sized
-	testAndTime(test_size[0], 8) ;
-	
-	//medium sized
-	testAndTime(test_size[1], 8) ;
-
-	//large sized
-	testAndTime(test_size[2], 8) ;
-}
-
-void LLPrivateMemoryPoolTester::fragmentationtest() 
-{
-	//for internal fragmentation statistics:
-	//every time when asking for a new chunk during correctness test, and performance test,
-	//print out the chunk usage statistices.
-}
-#endif
 //--------------------------------------------------------------------
 
 #if defined(LL_WINDOWS) && defined(LL_DEBUG_BUFFER_OVERRUN)
diff --git a/indra/llcommon/llmemory.h b/indra/llcommon/llmemory.h
index c37967e10ebe32baaf7367ba54095397ff81d0d7..5b17d9e3a454de51833a7251d01d4e66da75acdc 100644
--- a/indra/llcommon/llmemory.h
+++ b/indra/llcommon/llmemory.h
@@ -356,327 +356,6 @@ class LL_COMMON_API LLMemory
 	static BOOL sEnableMemoryFailurePrevention;
 };
 
-//
-//class LLPrivateMemoryPool defines a private memory pool for an application to use, so the application does not
-//need to access the heap directly fro each memory allocation. Throught this, the allocation speed is faster, 
-//and reduces virtaul address space gragmentation problem.
-//Note: this class is thread-safe by passing true to the constructor function. However, you do not need to do this unless
-//you are sure the memory allocation and de-allocation will happen in different threads. To make the pool thread safe
-//increases allocation and deallocation cost.
-//
-class LL_COMMON_API LLPrivateMemoryPool
-{
-	friend class LLPrivateMemoryPoolManager ;
-
-public:
-	class LL_COMMON_API LLMemoryBlock //each block is devided into slots uniformly
-	{
-	public: 
-		LLMemoryBlock() ;
-		~LLMemoryBlock() ;
-
-		void init(char* buffer, U32 buffer_size, U32 slot_size) ;
-		void setBuffer(char* buffer, U32 buffer_size) ;
-
-		char* allocate() ;
-		void  freeMem(void* addr) ;
-
-		bool empty() {return !mAllocatedSlots;}
-		bool isFull() {return mAllocatedSlots == mTotalSlots;}
-		bool isFree() {return !mTotalSlots;}
-
-		U32  getSlotSize()const {return mSlotSize;}
-		U32  getTotalSlots()const {return mTotalSlots;}
-		U32  getBufferSize()const {return mBufferSize;}
-		char* getBuffer() const {return mBuffer;}
-
-		//debug use
-		void resetBitMap() ;
-	private:
-		char* mBuffer;
-		U32   mSlotSize ; //when the block is not initialized, it is the buffer size.
-		U32   mBufferSize ;
-		U32   mUsageBits ;
-		U8    mTotalSlots ;
-		U8    mAllocatedSlots ;
-		U8    mDummySize ; //size of extra bytes reserved for mUsageBits.
-
-	public:
-		LLMemoryBlock* mPrev ;
-		LLMemoryBlock* mNext ;
-		LLMemoryBlock* mSelf ;
-
-		struct CompareAddress
-		{
-			bool operator()(const LLMemoryBlock* const& lhs, const LLMemoryBlock* const& rhs)
-			{
-				return (uintptr_t)lhs->getBuffer() < (uintptr_t)rhs->getBuffer();
-			}
-		};
-	};
-
-	class LL_COMMON_API LLMemoryChunk //is divided into memory blocks.
-	{
-	public:
-		LLMemoryChunk() ;
-		~LLMemoryChunk() ;
-
-		void init(char* buffer, U32 buffer_size, U32 min_slot_size, U32 max_slot_size, U32 min_block_size, U32 max_block_size) ;
-		void setBuffer(char* buffer, U32 buffer_size) ;
-
-		bool empty() ;
-		
-		char* allocate(U32 size) ;
-		void  freeMem(void* addr) ;
-
-		char* getBuffer() const {return mBuffer;}
-		U32 getBufferSize() const {return mBufferSize;}
-		U32 getAllocatedSize() const {return mAlloatedSize;}
-
-		bool containsAddress(const char* addr) const;
-
-		static U32 getMaxOverhead(U32 data_buffer_size, U32 min_slot_size, 
-													   U32 max_slot_size, U32 min_block_size, U32 max_block_size) ;
-	
-		void dump() ;
-
-	private:
-		U32 getPageIndex(uintptr_t addr) ;
-		U32 getBlockLevel(U32 size) ;
-		U16 getPageLevel(U32 size) ;
-		LLMemoryBlock* addBlock(U32 blk_idx) ;
-		void popAvailBlockList(U32 blk_idx) ;
-		void addToFreeSpace(LLMemoryBlock* blk) ;
-		void removeFromFreeSpace(LLMemoryBlock* blk) ;
-		void removeBlock(LLMemoryBlock* blk) ;
-		void addToAvailBlockList(LLMemoryBlock* blk) ;
-		U32  calcBlockSize(U32 slot_size);
-		LLMemoryBlock* createNewBlock(LLMemoryBlock* blk, U32 buffer_size, U32 slot_size, U32 blk_idx) ;
-
-	private:
-		LLMemoryBlock** mAvailBlockList ;//256 by mMinSlotSize
-		LLMemoryBlock** mFreeSpaceList;
-		LLMemoryBlock*  mBlocks ; //index of blocks by address.
-		
-		char* mBuffer ;
-		U32   mBufferSize ;
-		char* mDataBuffer ;
-		char* mMetaBuffer ;
-		U32   mMinBlockSize ;
-		U32   mMinSlotSize ;
-		U32   mMaxSlotSize ;
-		U32   mAlloatedSize ;
-		U16   mBlockLevels;
-		U16   mPartitionLevels;
-
-	public:
-		//form a linked list
-		LLMemoryChunk* mNext ;
-		LLMemoryChunk* mPrev ;
-	} ;
-
-private:
-	LLPrivateMemoryPool(S32 type, U32 max_pool_size) ;
-	~LLPrivateMemoryPool() ;
-
-	char *allocate(U32 size) ;
-	void  freeMem(void* addr) ;
-	
-	void  dump() ;
-	U32   getTotalAllocatedSize() ;
-	U32   getTotalReservedSize() {return mReservedPoolSize;}
-	S32   getType() const {return mType; }
-	bool  isEmpty() const {return !mNumOfChunks; }
-
-private:
-	void lock() ;
-	void unlock() ;	
-	S32 getChunkIndex(U32 size) ;
-	LLMemoryChunk*  addChunk(S32 chunk_index) ;
-	bool checkSize(U32 asked_size) ;
-	void removeChunk(LLMemoryChunk* chunk) ;
-	U16  findHashKey(const char* addr);
-	void addToHashTable(LLMemoryChunk* chunk) ;
-	void removeFromHashTable(LLMemoryChunk* chunk) ;
-	void rehash() ;
-	bool fillHashTable(U16 start, U16 end, LLMemoryChunk* chunk) ;
-	LLMemoryChunk* findChunk(const char* addr) ;
-
-	void destroyPool() ;
-
-public:
-	enum
-	{
-		SMALL_ALLOCATION = 0, //from 8 bytes to 2KB(exclusive), page size 2KB, max chunk size is 4MB.
-		MEDIUM_ALLOCATION,    //from 2KB to 512KB(exclusive), page size 32KB, max chunk size 4MB
-		LARGE_ALLOCATION,     //from 512KB to 4MB(inclusive), page size 64KB, max chunk size 16MB
-		SUPER_ALLOCATION      //allocation larger than 4MB.
-	};
-
-	enum
-	{
-		STATIC = 0 ,       //static pool(each alllocation stays for a long time) without threading support
-		VOLATILE,          //Volatile pool(each allocation stays for a very short time) without threading support
-		STATIC_THREADED,   //static pool with threading support
-		VOLATILE_THREADED, //volatile pool with threading support
-		MAX_TYPES
-	}; //pool types
-
-private:
-	LLMutex* mMutexp ;
-	U32  mMaxPoolSize;
-	U32  mReservedPoolSize ;	
-
-	LLMemoryChunk* mChunkList[SUPER_ALLOCATION] ; //all memory chunks reserved by this pool, sorted by address	
-	U16 mNumOfChunks ;
-	U16 mHashFactor ;
-
-	S32 mType ;
-
-	class LLChunkHashElement
-	{
-	public:
-		LLChunkHashElement() {mFirst = NULL ; mSecond = NULL ;}
-
-		bool add(LLMemoryChunk* chunk) ;
-		void remove(LLMemoryChunk* chunk) ;
-		LLMemoryChunk* findChunk(const char* addr) ;
-
-		bool empty() {return !mFirst && !mSecond; }
-		bool full()  {return mFirst && mSecond; }
-		bool hasElement(LLMemoryChunk* chunk) {return mFirst == chunk || mSecond == chunk;}
-
-	private:
-		LLMemoryChunk* mFirst ;
-		LLMemoryChunk* mSecond ;
-	};
-	std::vector<LLChunkHashElement> mChunkHashList ;
-};
-
-class LL_COMMON_API LLPrivateMemoryPoolManager
-{
-private:
-	LLPrivateMemoryPoolManager(BOOL enabled, U32 max_pool_size) ;
-	~LLPrivateMemoryPoolManager() ;
-
-public:	
-	static LLPrivateMemoryPoolManager* getInstance() ;
-	static void initClass(BOOL enabled, U32 pool_size) ;
-	static void destroyClass() ;
-
-	LLPrivateMemoryPool* newPool(S32 type) ;
-	void deletePool(LLPrivateMemoryPool* pool) ;
-
-private:	
-	std::vector<LLPrivateMemoryPool*> mPoolList ;	
-	U32  mMaxPrivatePoolSize;
-
-	static LLPrivateMemoryPoolManager* sInstance ;
-	static BOOL sPrivatePoolEnabled;
-	static std::vector<LLPrivateMemoryPool*> sDanglingPoolList ;
-public:
-	//debug and statistics info.
-	void updateStatistics() ;
-
-	U32 mTotalReservedSize ;
-	U32 mTotalAllocatedSize ;
-
-public:
-#if __DEBUG_PRIVATE_MEM__
-	static char* allocate(LLPrivateMemoryPool* poolp, U32 size, const char* function, const int line) ;	
-	
-	typedef std::map<char*, std::string> mem_allocation_info_t ;
-	static mem_allocation_info_t sMemAllocationTracker;
-#else
-	static char* allocate(LLPrivateMemoryPool* poolp, U32 size) ;	
-#endif
-	static void  freeMem(LLPrivateMemoryPool* poolp, void* addr) ;
-};
-
-//-------------------------------------------------------------------------------------
-#if __DEBUG_PRIVATE_MEM__
-#define ALLOCATE_MEM(poolp, size) LLPrivateMemoryPoolManager::allocate((poolp), (size), __FUNCTION__, __LINE__)
-#else
-#define ALLOCATE_MEM(poolp, size) LLPrivateMemoryPoolManager::allocate((poolp), (size))
-#endif
-#define FREE_MEM(poolp, addr) LLPrivateMemoryPoolManager::freeMem((poolp), (addr))
-//-------------------------------------------------------------------------------------
-
-//
-//the below singleton is used to test the private memory pool.
-//
-#if 0
-class LL_COMMON_API LLPrivateMemoryPoolTester
-{
-private:
-	LLPrivateMemoryPoolTester() ;
-	~LLPrivateMemoryPoolTester() ;
-
-public:
-	static LLPrivateMemoryPoolTester* getInstance() ;
-	static void destroy() ;
-
-	void run(S32 type) ;	
-
-private:
-	void correctnessTest() ;
-	void performanceTest() ;
-	void fragmentationtest() ;
-
-	void test(U32 min_size, U32 max_size, U32 stride, U32 times, bool random_deletion, bool output_statistics) ;
-	void testAndTime(U32 size, U32 times) ;
-
-#if 0
-public:
-	void* operator new(size_t size)
-	{
-		return (void*)sPool->allocate(size) ;
-	}
-    void  operator delete(void* addr)
-	{
-		sPool->freeMem(addr) ;
-	}
-	void* operator new[](size_t size)
-	{
-		return (void*)sPool->allocate(size) ;
-	}
-    void  operator delete[](void* addr)
-	{
-		sPool->freeMem(addr) ;
-	}
-#endif
-
-private:
-	static LLPrivateMemoryPoolTester* sInstance;
-	static LLPrivateMemoryPool* sPool ;
-	static LLPrivateMemoryPool* sThreadedPool ;
-};
-#if 0
-//static
-void* LLPrivateMemoryPoolTester::operator new(size_t size)
-{
-	return (void*)sPool->allocate(size) ;
-}
-
-//static
-void  LLPrivateMemoryPoolTester::operator delete(void* addr)
-{
-	sPool->free(addr) ;
-}
-
-//static
-void* LLPrivateMemoryPoolTester::operator new[](size_t size)
-{
-	return (void*)sPool->allocate(size) ;
-}
-
-//static
-void  LLPrivateMemoryPoolTester::operator delete[](void* addr)
-{
-	sPool->free(addr) ;
-}
-#endif
-#endif
 // LLRefCount moved to llrefcount.h
 
 // LLPointer moved to llpointer.h
diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp
index 4a76d1509635b24a57975997a11ef803d4911114..dca03cfe04fb7c279040e72a52ec38e1fdace852 100644
--- a/indra/llimage/llimage.cpp
+++ b/indra/llimage/llimage.cpp
@@ -588,7 +588,6 @@ std::string LLImage::sLastErrorMessage;
 LLMutex* LLImage::sMutex = NULL;
 bool LLImage::sUseNewByteRange = false;
 S32  LLImage::sMinimalReverseByteRangePercent = 75;
-LLPrivateMemoryPool* LLImageBase::sPrivatePoolp = NULL ;
 
 //static
 void LLImage::initClass(bool use_new_byte_range, S32 minimal_reverse_byte_range_percent)
@@ -596,8 +595,6 @@ void LLImage::initClass(bool use_new_byte_range, S32 minimal_reverse_byte_range_
 	sUseNewByteRange = use_new_byte_range;
     sMinimalReverseByteRangePercent = minimal_reverse_byte_range_percent;
 	sMutex = new LLMutex(NULL);
-
-	LLImageBase::createPrivatePool() ;
 }
 
 //static
@@ -605,8 +602,6 @@ void LLImage::cleanupClass()
 {
 	delete sMutex;
 	sMutex = NULL;
-
-	LLImageBase::destroyPrivatePool() ;
 }
 
 //static
@@ -644,25 +639,6 @@ LLImageBase::~LLImageBase()
 	deleteData(); // virtual
 }
 
-//static 
-void LLImageBase::createPrivatePool() 
-{
-	if(!sPrivatePoolp)
-	{
-		sPrivatePoolp = LLPrivateMemoryPoolManager::getInstance()->newPool(LLPrivateMemoryPool::STATIC_THREADED) ;
-	}
-}
-	
-//static 
-void LLImageBase::destroyPrivatePool() 
-{
-	if(sPrivatePoolp)
-	{
-		LLPrivateMemoryPoolManager::getInstance()->deletePool(sPrivatePoolp) ;
-		sPrivatePoolp = NULL ;
-	}
-}
-
 // virtual
 void LLImageBase::dump()
 {
@@ -696,7 +672,7 @@ void LLImageBase::sanityCheck()
 // virtual
 void LLImageBase::deleteData()
 {
-	FREE_MEM(sPrivatePoolp, mData) ;
+	ll_aligned_free_16(mData);
 	disclaimMem(mDataSize);
 	mDataSize = 0;
 	mData = NULL;
@@ -736,7 +712,7 @@ U8* LLImageBase::allocateData(S32 size)
 	if (!mBadBufferAllocation && (!mData || size != mDataSize))
 	{
 		deleteData(); // virtual
-		mData = (U8*)ALLOCATE_MEM(sPrivatePoolp, size);
+		mData = (U8*)ll_aligned_malloc_16(size);
 		if (!mData)
 		{
 			LL_WARNS() << "Failed to allocate image data size [" << size << "]" << LL_ENDL;
@@ -763,7 +739,7 @@ U8* LLImageBase::allocateData(S32 size)
 // virtual
 U8* LLImageBase::reallocateData(S32 size)
 {
-	U8 *new_datap = (U8*)ALLOCATE_MEM(sPrivatePoolp, size);
+	U8 *new_datap = (U8*)ll_aligned_malloc_16(size);
 	if (!new_datap)
 	{
 		LL_WARNS() << "Out of memory in LLImageBase::reallocateData" << LL_ENDL;
@@ -773,7 +749,7 @@ U8* LLImageBase::reallocateData(S32 size)
 	{
 		S32 bytes = llmin(mDataSize, size);
 		memcpy(new_datap, mData, bytes);	/* Flawfinder: ignore */
-		FREE_MEM(sPrivatePoolp, mData) ;
+		ll_aligned_free_16(mData) ;
 	}
 	mData = new_datap;
 	disclaimMem(mDataSize);
@@ -1470,7 +1446,7 @@ bool LLImageRaw::scale( S32 new_width, S32 new_height, bool scale_image_data )
 
 		if (new_data_size > 0)
         {
-            U8 *new_data = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), new_data_size); 
+            U8 *new_data = (U8*)ll_aligned_malloc_16(new_data_size); 
             if(NULL == new_data) 
             {
                 return false; 
@@ -2169,7 +2145,7 @@ void LLImageFormatted::appendData(U8 *data, S32 size)
 			S32 newsize = cursize + size;
 			reallocateData(newsize);
 			memcpy(getData() + cursize, data, size);
-			FREE_MEM(LLImageBase::getPrivatePool(), data);
+			ll_aligned_free_16(data);
 		}
 	}
 }
diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h
index 958c9fad3d1eef2ea7f37285950e3de0f0367ee3..8ec49d3f0f96cb806b08440a212da8f91ee7818e 100644
--- a/indra/llimage/llimage.h
+++ b/indra/llimage/llimage.h
@@ -71,7 +71,6 @@ const S32 HTTP_PACKET_SIZE = 1496;
 class LLImageFormatted;
 class LLImageRaw;
 class LLColor4U;
-class LLPrivateMemoryPool;
 
 typedef enum e_image_codec
 {
@@ -160,10 +159,6 @@ class LLImageBase
 	static F32 calc_download_priority(F32 virtual_size, F32 visible_area, S32 bytes_sent);
 
 	static EImageCodec getCodecFromExtension(const std::string& exten);
-	
-	static void createPrivatePool() ;
-	static void destroyPrivatePool() ;
-	static LLPrivateMemoryPool* getPrivatePool() {return sPrivatePoolp;}
 
 	//static LLTrace::MemStatHandle sMemStat;
 
@@ -178,8 +173,6 @@ class LLImageBase
 
 	bool mBadBufferAllocation ;
 	bool mAllowOverSize ;
-
-	static LLPrivateMemoryPool* sPrivatePoolp ;
 };
 
 // Raw representation of an image (used for textures, and other uncompressed formats
diff --git a/indra/llimage/llimagedxt.cpp b/indra/llimage/llimagedxt.cpp
index 0ec83415a09d98e2585d64b3c7c525235065a28d..3a7319d765d674d20592370931a9086ee764efce 100644
--- a/indra/llimage/llimagedxt.cpp
+++ b/indra/llimage/llimagedxt.cpp
@@ -430,7 +430,7 @@ bool LLImageDXT::convertToDXR()
 	S32 nmips = calcNumMips(width,height);
 	S32 total_bytes = getDataSize();
 	U8* olddata = getData();
-	U8* newdata = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), total_bytes);
+	U8* newdata = (U8*)ll_aligned_malloc_16(total_bytes);
 	if (!newdata)
 	{
 		LL_ERRS() << "Out of memory in LLImageDXT::convertToDXR()" << LL_ENDL;
diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp
index c40df009d8a662304245e5e81fd60dd2b26cc660..4bff21610fc83c861fa301f6ce189823e0d1080b 100644
--- a/indra/llimage/llimagej2c.cpp
+++ b/indra/llimage/llimagej2c.cpp
@@ -368,7 +368,7 @@ bool LLImageJ2C::loadAndValidate(const std::string &filename)
 	}
 	else
 	{
-		U8 *data = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), file_size);
+		U8 *data = (U8*)ll_aligned_malloc_16(file_size);
 		if (!data)
 		{
 			infile.close();
@@ -383,7 +383,7 @@ bool LLImageJ2C::loadAndValidate(const std::string &filename)
 
 			if (s != APR_SUCCESS || (S32)bytes_read != file_size)
 			{
-				FREE_MEM(LLImageBase::getPrivatePool(), data);
+				ll_aligned_free_16(data);
 				setLastError("Unable to read entire file");
 				res = false;
 			}
diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp
index c06fdd9700c19dd09072431f90c033e71b8c8cc3..a55ca5ed9c3cef21a19cb99c1f48329403029b43 100644
--- a/indra/llrender/llvertexbuffer.cpp
+++ b/indra/llrender/llvertexbuffer.cpp
@@ -98,7 +98,6 @@ U32 LLVertexBuffer::sCurVAOName = 1;
 U32 LLVertexBuffer::sAllocatedIndexBytes = 0;
 U32 LLVertexBuffer::sIndexCount = 0;
 
-LLPrivateMemoryPool* LLVertexBuffer::sPrivatePoolp = NULL;
 U32 LLVertexBuffer::sBindCount = 0;
 U32 LLVertexBuffer::sSetCount = 0;
 S32 LLVertexBuffer::sCount = 0;
@@ -863,11 +862,6 @@ void LLVertexBuffer::initClass(bool use_vbo, bool no_vbo_mapping)
 {
 	sEnableVBOs = use_vbo && gGLManager.mHasVertexBufferObject;
 	sDisableVBOMapping = sEnableVBOs && no_vbo_mapping;
-
-	if (!sPrivatePoolp)
-	{ 
-		sPrivatePoolp = LLPrivateMemoryPoolManager::getInstance()->newPool(LLPrivateMemoryPool::STATIC);
-	}
 }
 
 //static 
@@ -910,12 +904,6 @@ void LLVertexBuffer::cleanupClass()
 	sStreamVBOPool.cleanup();
 	sDynamicVBOPool.cleanup();
 	sDynamicCopyVBOPool.cleanup();
-
-	if(sPrivatePoolp)
-	{
-		LLPrivateMemoryPoolManager::getInstance()->deletePool(sPrivatePoolp);
-		sPrivatePoolp = NULL;
-	}
 }
 
 //----------------------------------------------------------------------------
@@ -1206,7 +1194,7 @@ bool LLVertexBuffer::createGLBuffer(U32 size)
 	{
 		static int gl_buffer_idx = 0;
 		mGLBuffer = ++gl_buffer_idx;
-		mMappedData = (U8*)ALLOCATE_MEM(sPrivatePoolp, size);
+		mMappedData = (U8*)ll_aligned_malloc_16(size);
 		disclaimMem(mSize);
 		mSize = size;
 		claimMem(mSize);
@@ -1248,7 +1236,7 @@ bool LLVertexBuffer::createGLIndices(U32 size)
 	}
 	else
 	{
-		mMappedIndexData = (U8*)ALLOCATE_MEM(sPrivatePoolp, size);
+		mMappedIndexData = (U8*)ll_aligned_malloc_16(size);
 		static int gl_buffer_idx = 0;
 		mGLIndices = ++gl_buffer_idx;
 		mIndicesSize = size;
@@ -1271,7 +1259,7 @@ void LLVertexBuffer::destroyGLBuffer()
 		}
 		else
 		{
-			FREE_MEM(sPrivatePoolp, (void*) mMappedData);
+			ll_aligned_free_16((void*)mMappedData);
 			mMappedData = NULL;
 			mEmpty = true;
 		}
@@ -1291,7 +1279,7 @@ void LLVertexBuffer::destroyGLIndices()
 		}
 		else
 		{
-			FREE_MEM(sPrivatePoolp, (void*) mMappedIndexData);
+			ll_aligned_free_16((void*)mMappedIndexData);
 			mMappedIndexData = NULL;
 			mEmpty = true;
 		}
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 4a4f4bfc61946333a53ff25c2a8573d7bc5fdd01..1cf3b31ac0eeffca080e10dfdf8915acba691f96 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -2369,7 +2369,7 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
-    <key>DebugShowPrivateMem</key>
+    <key>DEPRECATED: DebugShowPrivateMem</key>  <!-- deprecated (see MAINT-8091) -->
     <map>
       <key>Comment</key>
       <string>Show Private Mem Info</string>
@@ -6408,10 +6408,10 @@
         <key>Value</key>
             <real>600.0</real>
         </map>
-    <key>MemoryPrivatePoolEnabled</key>
+    <key>MemoryPrivatePoolEnabled</key>  <!-- deprecated (see MAINT-8091) -->
     <map>
       <key>Comment</key>
-      <string>Enable the private memory pool management</string>
+      <string>DEPRECATED: Enable the private memory pool management</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
@@ -6419,10 +6419,10 @@
       <key>Value</key>
       <integer>0</integer>
     </map>
-    <key>MemoryPrivatePoolSize</key>
+    <key>MemoryPrivatePoolSize</key>  <!-- deprecated (see MAINT-8091) -->
     <map>
       <key>Comment</key>
-      <string>Size of the private memory pool in MB (min. value is 256)</string>
+      <string>DEPRECATED: Size of the private memory pool in MB (min. value is 256)</string>
       <key>Persist</key>
       <integer>1</integer>
       <key>Type</key>
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index d48ff458d71821f1b60c16740e255f2eaea32156..73f70dffe49743feed636323f0b2fc33c3fa5521 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -799,7 +799,6 @@ bool LLAppViewer::init()
 	initMaxHeapSize() ;
 	LLCoros::instance().setStackSize(gSavedSettings.getS32("CoroutineStackSize"));
 
-	LLPrivateMemoryPoolManager::initClass((BOOL)gSavedSettings.getBOOL("MemoryPrivatePoolEnabled"), (U32)gSavedSettings.getU32("MemoryPrivatePoolSize")*1024*1024) ;
 	// write Google Breakpad minidump files to a per-run dump directory to avoid multiple viewer issues.
 	std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_DUMP, "");
 	mDumpPath = logdir;
@@ -1363,10 +1362,6 @@ bool LLAppViewer::doFrame()
 	LLEventPump& mainloop(LLEventPumps::instance().obtain("mainloop"));
 	LLSD newFrame;
 
-	//LLPrivateMemoryPoolTester::getInstance()->run(false) ;
-	//LLPrivateMemoryPoolTester::getInstance()->run(true) ;
-	//LLPrivateMemoryPoolTester::destroy() ;
-
 	LL_RECORD_BLOCK_TIME(FTM_FRAME);
 	LLTrace::BlockTimer::processTimes();
 	LLTrace::get_frame_recording().nextPeriod();
@@ -2075,9 +2070,6 @@ bool LLAppViewer::cleanup()
 
 	LLMainLoopRepeater::instance().stop();
 
-	//release all private memory pools.
-	LLPrivateMemoryPoolManager::destroyClass() ;
-
 	ll_close_fail_log();
 
 	LLError::LLCallStacks::cleanup();
diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index dadf2f97019d98d36fa1205e36692a10ac83fbf6..2a0d961952c49e14aad5ac53d906c030d9399cd8 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -117,7 +117,7 @@ class LLTextureCacheWorker : public LLWorkerClass
 	~LLTextureCacheWorker()
 	{
 		llassert_always(!haveWork());
-		FREE_MEM(LLImageBase::getPrivatePool(), mReadData);
+		ll_aligned_free_16(mReadData);
 	}
 
 	// override this interface
@@ -237,7 +237,7 @@ bool LLTextureCacheLocalFileWorker::doRead()
 // 						<< " Bytes: " << mDataSize << " Offset: " << mOffset
 // 						<< " / " << mDataSize << LL_ENDL;
 				mDataSize = 0; // failed
-				FREE_MEM(LLImageBase::getPrivatePool(), mReadData);
+				ll_aligned_free_16(mReadData);
 				mReadData = NULL;
 			}
 			return true;
@@ -252,7 +252,7 @@ bool LLTextureCacheLocalFileWorker::doRead()
 	{
 		mDataSize = local_size;
 	}
-	mReadData = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), mDataSize);
+	mReadData = (U8*)ll_aligned_malloc_16(mDataSize);
 	
 	S32 bytes_read = LLAPRFile::readEx(mFileName, mReadData, mOffset, mDataSize, mCache->getLocalAPRFilePool());	
 
@@ -262,7 +262,7 @@ bool LLTextureCacheLocalFileWorker::doRead()
 // 				<< " Bytes: " << mDataSize << " Offset: " << mOffset
 // 				<< " / " << mDataSize << LL_ENDL;
 		mDataSize = 0;
-		FREE_MEM(LLImageBase::getPrivatePool(), mReadData);
+		ll_aligned_free_16(mReadData);
 		mReadData = NULL;
 	}
 	else
@@ -386,7 +386,7 @@ bool LLTextureCacheRemoteWorker::doRead()
 			mDataSize = local_size;
 		}
 		// Allocate read buffer
-		mReadData = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), mDataSize);
+		mReadData = (U8*)ll_aligned_malloc_16(mDataSize);
 
 		if (mReadData)
 		{
@@ -402,7 +402,7 @@ bool LLTextureCacheRemoteWorker::doRead()
  						<< " Bytes: " << mDataSize << " Offset: " << mOffset
  					<< " / " << mDataSize << LL_ENDL;
 				mDataSize = 0;
-				FREE_MEM(LLImageBase::getPrivatePool(), mReadData);
+				ll_aligned_free_16(mReadData);
 				mReadData = NULL;
 			}
 			else
@@ -451,7 +451,7 @@ bool LLTextureCacheRemoteWorker::doRead()
 		S32 size = TEXTURE_CACHE_ENTRY_SIZE - mOffset;
 		size = llmin(size, mDataSize);
 		// Allocate the read buffer
-		mReadData = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), size);
+		mReadData = (U8*)ll_aligned_malloc_16(size);
 		if (mReadData)
 		{
 			S32 bytes_read = LLAPRFile::readEx(mCache->mHeaderDataFileName, 
@@ -461,7 +461,7 @@ bool LLTextureCacheRemoteWorker::doRead()
 				LL_WARNS() << "LLTextureCacheWorker: "  << mID
 						<< " incorrect number of bytes read from header: " << bytes_read
 						<< " / " << size << LL_ENDL;
-				FREE_MEM(LLImageBase::getPrivatePool(), mReadData);
+				ll_aligned_free_16(mReadData);
 				mReadData = NULL;
 				mDataSize = -1; // failed
 				done = true;
@@ -500,7 +500,7 @@ bool LLTextureCacheRemoteWorker::doRead()
 			S32 data_offset, file_size, file_offset;
 			
 			// Reserve the whole data buffer first
-			U8* data = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), mDataSize);
+			U8* data = (U8*)ll_aligned_malloc_16(mDataSize);
 			if (data)
 			{
 				// Set the data file pointers taking the read offset into account. 2 cases:
@@ -514,7 +514,7 @@ bool LLTextureCacheRemoteWorker::doRead()
 					// Copy the raw data we've been holding from the header cache into the new sized buffer
 					llassert_always(mReadData);
 					memcpy(data, mReadData, data_offset);
-					FREE_MEM(LLImageBase::getPrivatePool(), mReadData);
+					ll_aligned_free_16(mReadData);
 					mReadData = NULL;
 				}
 				else
@@ -540,7 +540,7 @@ bool LLTextureCacheRemoteWorker::doRead()
 					LL_WARNS() << "LLTextureCacheWorker: "  << mID
 							<< " incorrect number of bytes read from body: " << bytes_read
 							<< " / " << file_size << LL_ENDL;
-					FREE_MEM(LLImageBase::getPrivatePool(), mReadData);
+					ll_aligned_free_16(mReadData);
 					mReadData = NULL;
 					mDataSize = -1; // failed
 					done = true;
@@ -550,7 +550,7 @@ bool LLTextureCacheRemoteWorker::doRead()
 			{
 				LL_WARNS() << "LLTextureCacheWorker: "  << mID
 					<< " failed to allocate memory for reading: " << mDataSize << LL_ENDL;
-				FREE_MEM(LLImageBase::getPrivatePool(), mReadData);
+				ll_aligned_free_16(mReadData);
 				mReadData = NULL;
 				mDataSize = -1; // failed
 				done = true;
@@ -673,11 +673,11 @@ bool LLTextureCacheRemoteWorker::doWrite()
 			{
 				// We need to write a full record in the header cache so, if the amount of data is smaller
 				// than a record, we need to transfer the data to a buffer padded with 0 and write that
-				U8* padBuffer = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), TEXTURE_CACHE_ENTRY_SIZE);
+				U8* padBuffer = (U8*)ll_aligned_malloc_16(TEXTURE_CACHE_ENTRY_SIZE);
 				memset(padBuffer, 0, TEXTURE_CACHE_ENTRY_SIZE);		// Init with zeros
 				memcpy(padBuffer, mWriteData, mDataSize);			// Copy the write buffer
 				bytes_written = LLAPRFile::writeEx(mCache->mHeaderDataFileName, padBuffer, offset, size, mCache->getLocalAPRFilePool());
-				FREE_MEM(LLImageBase::getPrivatePool(), padBuffer);
+				ll_aligned_free_16(padBuffer);
 			}
 			else
 			{
@@ -783,7 +783,7 @@ void LLTextureCacheWorker::finishWork(S32 param, bool completed)
 			}
 			else
 			{
-				FREE_MEM(LLImageBase::getPrivatePool(), mReadData);
+				ll_aligned_free_16(mReadData);
 				mReadData = NULL;
 			}
 		}
@@ -845,7 +845,7 @@ LLTextureCache::~LLTextureCache()
 	writeUpdatedEntries() ;
 	delete mFastCachep;
 	delete mFastCachePoolp;
-	FREE_MEM(LLImageBase::getPrivatePool(), mFastCachePadBuffer);
+	ll_aligned_free_16(mFastCachePadBuffer);
 }
 
 //////////////////////////////////////////////////////////////////////////////
@@ -1983,10 +1983,10 @@ LLPointer<LLImageRaw> LLTextureCache::readFromFastCache(const LLUUID& id, S32& d
 		}
 		discardlevel = head[3];
 		
-		data =  (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), image_size);
+		data = (U8*)ll_aligned_malloc_16(image_size);
 		if(mFastCachep->read(data, image_size) != image_size)
 		{
-			FREE_MEM(LLImageBase::getPrivatePool(), data);
+			ll_aligned_free_16(data);
 			closeFastCache();
 			return NULL;
 		}
@@ -2078,7 +2078,7 @@ void LLTextureCache::openFastCache(bool first_time)
 		{
 			if(!mFastCachePadBuffer)
 			{
-				mFastCachePadBuffer = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), TEXTURE_FAST_CACHE_ENTRY_SIZE);
+				mFastCachePadBuffer = (U8*)ll_aligned_malloc_16(TEXTURE_FAST_CACHE_ENTRY_SIZE);
 			}
 			mFastCachePoolp = new LLVolatileAPRPool();
 			if (LLAPRFile::isExist(mFastCacheFileName, mFastCachePoolp))
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index 1f7796e6d0954c569da637bc1e52ee64734d6f14..6fd90e49354ee30c846f881abc4535edb6ff6fff 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -1761,7 +1761,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
 				mRequestedOffset += src_offset;
 			}
 
-			U8 * buffer = (U8 *)ALLOCATE_MEM(LLImageBase::getPrivatePool(), total_size);
+			U8 * buffer = (U8 *)ll_aligned_malloc_16(total_size);
 			if (!buffer)
 			{
 				// abort. If we have no space for packet, we have not enough space to decode image
@@ -2266,7 +2266,7 @@ bool LLTextureFetchWorker::processSimulatorPackets()
 			if (buffer_size > cur_size)
 			{
 				/// We have new data
-				U8* buffer = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), buffer_size);
+				U8* buffer = (U8*)ll_aligned_malloc_16(buffer_size);
 				S32 offset = 0;
 				if (cur_size > 0 && mFirstPacket > 0)
 				{
@@ -5059,7 +5059,7 @@ void LLTextureFetchDebugger::callbackHTTP(FetchEntry & fetch, LLCore::HttpRespon
 		//LL_INFOS(LOG_TXT) << "Fetch Debugger : got results for " << fetch.mID << ", data_size = " << data_size << ", received = " << fetch.mCurlReceivedSize << ", requested = " << fetch.mRequestedSize << ", partial = " << partial << LL_ENDL;
 		if ((fetch.mCurlReceivedSize >= fetch.mRequestedSize) || !partial || (fetch.mRequestedSize == 600))
 		{
-			U8* d_buffer = (U8*)ALLOCATE_MEM(LLImageBase::getPrivatePool(), data_size);
+			U8* d_buffer = (U8*)ll_aligned_malloc_16(data_size);
 			if (ba)
 			{
 				ba->read(0, d_buffer, data_size);
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 74deaffe168c4b2cff7e5bfa66623145b2f97b40..c057954606896a772e453a0aa0582b9f8ff739bd 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -740,16 +740,6 @@ class LLDebugText
 			ypos += y_inc;
 		}
 
-		if (gSavedSettings.getBOOL("DebugShowPrivateMem"))
-		{
-			LLPrivateMemoryPoolManager::getInstance()->updateStatistics() ;
-			addText(xpos, ypos, llformat("Total Reserved(KB): %d", LLPrivateMemoryPoolManager::getInstance()->mTotalReservedSize / 1024));
-			ypos += y_inc;
-
-			addText(xpos, ypos, llformat("Total Allocated(KB): %d", LLPrivateMemoryPoolManager::getInstance()->mTotalAllocatedSize / 1024));
-			ypos += y_inc;
-		}
-
 		// only display these messages if we are actually rendering beacons at this moment
 		if (LLPipeline::getRenderBeacons() && LLFloaterReg::instanceVisible("beacons"))
 		{
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index 92511167c070c79a7dc4f403b7c9d7ea0a57b0de..fa15fb06574fb2a36af47d643778c63fbc388c53 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -2373,16 +2373,6 @@
                function="ToggleControl"
                parameter="DebugShowMemory" />
             </menu_item_check>
-	     <menu_item_check
-               label="Show Private Mem Info"
-               name="Show Private Mem Info">
-              <menu_item_check.on_check
-               function="CheckControl"
-               parameter="DebugShowPrivateMem" />
-              <menu_item_check.on_click
-               function="ToggleControl"
-               parameter="DebugShowPrivateMem" />
-            </menu_item_check>
 
             <menu_item_separator/>