diff options
| -rw-r--r-- | indra/llimage/llimage.cpp | 70 | ||||
| -rw-r--r-- | indra/llimage/llimage.h | 15 | ||||
| -rw-r--r-- | indra/llimage/llimagedxt.cpp | 2 | ||||
| -rw-r--r-- | indra/llimage/llimagej2c.cpp | 4 | ||||
| -rw-r--r-- | indra/newview/llappviewer.cpp | 3 | ||||
| -rw-r--r-- | indra/newview/lltexturecache.cpp | 30 | ||||
| -rw-r--r-- | indra/newview/lltexturefetch.cpp | 14 | 
7 files changed, 103 insertions, 35 deletions
| diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp index 5c33b675ca..c99313f0ea 100644 --- a/indra/llimage/llimage.cpp +++ b/indra/llimage/llimage.cpp @@ -39,6 +39,7 @@  #include "llimagepng.h"  #include "llimagedxt.h"  #include "llimageworker.h" +#include "llmemory.h"  //---------------------------------------------------------------------------  // LLImage @@ -47,12 +48,15 @@  //static  std::string LLImage::sLastErrorMessage;  LLMutex* LLImage::sMutex = NULL; +LLPrivateMemoryPool* LLImageBase::sPrivatePoolp = NULL ;  //static  void LLImage::initClass()  {  	sMutex = new LLMutex(NULL);  	LLImageJ2C::openDSO(); + +	LLImageBase::createPrivatePool() ;  }  //static @@ -61,6 +65,8 @@ void LLImage::cleanupClass()  	LLImageJ2C::closeDSO();  	delete sMutex;  	sMutex = NULL; + +	LLImageBase::destroyPrivatePool() ;  }  //static @@ -99,6 +105,53 @@ LLImageBase::~LLImageBase()  	deleteData(); // virtual  } +//static  +void LLImageBase::createPrivatePool()  +{ +	const U32 MAX_POOL_SIZE = 512 * 1024 * 1024 ; //512 MB + +	if(!sPrivatePoolp) +	{ +		sPrivatePoolp = LLPrivateMemoryPoolManager::getInstance()->newPool(MAX_POOL_SIZE, true) ; +	} +} +	 +//static  +void LLImageBase::destroyPrivatePool()  +{ +	if(sPrivatePoolp) +	{ +		LLPrivateMemoryPoolManager::getInstance()->deletePool(sPrivatePoolp) ; +		sPrivatePoolp = NULL ; +	} +} + +//static +char* LLImageBase::allocateMemory(S32 size)  +{ +	if(sPrivatePoolp) +	{ +		return sPrivatePoolp->allocate(size) ; +	} +	else +	{ +		return new char[size]; +	} +} + +//static +void  LLImageBase::deleteMemory(void* p)  +{ +	if(sPrivatePoolp) +	{ +		sPrivatePoolp->free(p) ; +	} +	else +	{ +		delete[] p ; +	} +} +  // virtual  void LLImageBase::dump()  { @@ -132,7 +185,7 @@ void LLImageBase::sanityCheck()  // virtual  void LLImageBase::deleteData()  { -	delete[] mData; +	deleteMemory(mData) ;  	mData = NULL;  	mDataSize = 0;  } @@ -169,7 +222,7 @@ U8* LLImageBase::allocateData(S32 size)  	{  		deleteData(); // virtual  		mBadBufferAllocation = false ; -		mData = new U8[size]; +		mData = (U8*)allocateMemory(size);  		if (!mData)  		{  			llwarns << "allocate image data: " << size << llendl; @@ -187,7 +240,7 @@ U8* LLImageBase::allocateData(S32 size)  U8* LLImageBase::reallocateData(S32 size)  {  	LLMemType mt1(mMemType); -	U8 *new_datap = new U8[size]; +	U8 *new_datap = (U8*)allocateMemory(size);  	if (!new_datap)  	{  		llwarns << "Out of memory in LLImageBase::reallocateData" << llendl; @@ -197,7 +250,7 @@ U8* LLImageBase::reallocateData(S32 size)  	{  		S32 bytes = llmin(mDataSize, size);  		memcpy(new_datap, mData, bytes);	/* Flawfinder: ignore */ -		delete[] mData; +		deleteMemory(mData) ;  	}  	mData = new_datap;  	mDataSize = size; @@ -343,6 +396,7 @@ BOOL LLImageRaw::resize(U16 width, U16 height, S8 components)  	return TRUE;  } +#if 0  U8 * LLImageRaw::getSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height) const  {  	LLMemType mt1(mMemType); @@ -363,6 +417,7 @@ U8 * LLImageRaw::getSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height) const  	}  	return data;  } +#endif  BOOL LLImageRaw::setSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height,  							 const U8 *data, U32 stride, BOOL reverse_y) @@ -832,6 +887,7 @@ void LLImageRaw::copyScaled( LLImageRaw* src )  	}  } +#if 0  //scale down image by not blending a pixel with its neighbors.  BOOL LLImageRaw::scaleDownWithoutBlending( S32 new_width, S32 new_height)  { @@ -855,7 +911,7 @@ BOOL LLImageRaw::scaleDownWithoutBlending( S32 new_width, S32 new_height)  	ratio_x -= 1.0f ;  	ratio_y -= 1.0f ; -	U8* new_data = new U8[new_data_size] ; +	U8* new_data = allocateMemory(new_data_size) ;  	llassert_always(new_data != NULL) ;  	U8* old_data = getData() ; @@ -877,6 +933,7 @@ BOOL LLImageRaw::scaleDownWithoutBlending( S32 new_width, S32 new_height)  	return TRUE ;  } +#endif  BOOL LLImageRaw::scale( S32 new_width, S32 new_height, BOOL scale_image_data )  { @@ -1529,6 +1586,7 @@ void LLImageFormatted::setData(U8 *data, S32 size)  	{  		deleteData();  		setDataAndSize(data, size); // Access private LLImageBase members +  		sGlobalFormattedMemory += getDataSize();  	}  } @@ -1547,7 +1605,7 @@ void LLImageFormatted::appendData(U8 *data, S32 size)  			S32 newsize = cursize + size;  			reallocateData(newsize);  			memcpy(getData() + cursize, data, size); -			delete[] data; +			deleteMemory(data);  		}  	}  } diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h index bca7e915fa..b137ea9a61 100644 --- a/indra/llimage/llimage.h +++ b/indra/llimage/llimage.h @@ -29,7 +29,6 @@  #include "lluuid.h"  #include "llstring.h" -//#include "llmemory.h"  #include "llthread.h"  #include "llmemtype.h" @@ -56,6 +55,7 @@ const S32 MAX_IMG_PACKET_SIZE = 1000;  class LLImageFormatted;  class LLImageRaw;  class LLColor4U; +class LLPrivateMemoryPool;  typedef enum e_image_codec  { @@ -127,7 +127,7 @@ public:  protected:  	// special accessor to allow direct setting of mData and mDataSize by LLImageFormatted -	void setDataAndSize(U8 *data, S32 size) { mData = data; mDataSize = size; } +	void setDataAndSize(U8 *data, S32 size) { mData = data; mDataSize = size; }	  public:  	static void generateMip(const U8 *indata, U8* mipdata, int width, int height, S32 nchannels); @@ -138,6 +138,11 @@ public:  	static EImageCodec getCodecFromExtension(const std::string& exten); +	static void createPrivatePool() ; +	static void destroyPrivatePool() ; +	static char* allocateMemory(S32 size) ; +	static void  deleteMemory(void* p) ;	 +  private:  	U8 *mData;  	S32 mDataSize; @@ -149,6 +154,8 @@ private:  	bool mBadBufferAllocation ;  	bool mAllowOverSize ; + +	static LLPrivateMemoryPool* sPrivatePoolp ;  public:  	LLMemType::DeclareMemType& mMemType; // debug  }; @@ -172,7 +179,7 @@ public:  	BOOL resize(U16 width, U16 height, S8 components); -	U8 * getSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height) const; +	//U8 * getSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height) const;  	BOOL setSubImage(U32 x_pos, U32 y_pos, U32 width, U32 height,  					 const U8 *data, U32 stride = 0, BOOL reverse_y = FALSE); @@ -184,7 +191,7 @@ public:  	void contractToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE, BOOL scale_image = TRUE);  	void biasedScaleToPowerOfTwo(S32 max_dim = MAX_IMAGE_SIZE);  	BOOL scale( S32 new_width, S32 new_height, BOOL scale_image = TRUE ); -	BOOL scaleDownWithoutBlending( S32 new_width, S32 new_height) ; +	//BOOL scaleDownWithoutBlending( S32 new_width, S32 new_height) ;  	// Fill the buffer with a constant color  	void fill( const LLColor4U& color ); diff --git a/indra/llimage/llimagedxt.cpp b/indra/llimage/llimagedxt.cpp index 4bd3efddaa..81be09a412 100644 --- a/indra/llimage/llimagedxt.cpp +++ b/indra/llimage/llimagedxt.cpp @@ -429,7 +429,7 @@ bool LLImageDXT::convertToDXR()  	S32 nmips = calcNumMips(width,height);  	S32 total_bytes = getDataSize();  	U8* olddata = getData(); -	U8* newdata = new U8[total_bytes]; +	U8* newdata = (U8*)allocateMemory(total_bytes);  	if (!newdata)  	{  		llerrs << "Out of memory in LLImageDXT::convertToDXR()" << llendl; diff --git a/indra/llimage/llimagej2c.cpp b/indra/llimage/llimagej2c.cpp index c8c866b7f2..0a13372b07 100644 --- a/indra/llimage/llimagej2c.cpp +++ b/indra/llimage/llimagej2c.cpp @@ -471,14 +471,14 @@ BOOL LLImageJ2C::loadAndValidate(const std::string &filename)  	}  	else  	{ -		U8 *data = new U8[file_size]; +		U8 *data = (U8*)allocateMemory(file_size);  		apr_size_t bytes_read = file_size;  		apr_status_t s = apr_file_read(apr_file, data, &bytes_read); // modifies bytes_read	  		infile.close() ;  		if (s != APR_SUCCESS || (S32)bytes_read != file_size)  		{ -			delete[] data; +			deleteMemory(data);  			setLastError("Unable to read entire file");  			res = FALSE;  		} diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index d1727a0e83..664ec7b0fb 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -1797,6 +1797,9 @@ bool LLAppViewer::cleanup()  		llinfos << "File launched." << llendflush;  	} +	//release all private memory pools. +	LLPrivateMemoryPoolManager::destroyClass() ; +  	ll_close_fail_log();      llinfos << "Goodbye!" << llendflush; diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index 6a213309a0..d64345deee 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -113,7 +113,7 @@ public:  	~LLTextureCacheWorker()  	{  		llassert_always(!haveWork()); -		delete[] mReadData; +		LLImageBase::deleteMemory(mReadData);  	}  	// override this interface @@ -215,7 +215,7 @@ bool LLTextureCacheLocalFileWorker::doRead()  			mDataSize = 0;  			return true;  		} -		mReadData = new U8[mDataSize]; +		mReadData = (U8*)LLImageBase::allocateMemory(mDataSize);  		mBytesRead = -1;  		mBytesToRead = mDataSize;  		setPriority(LLWorkerThread::PRIORITY_LOW | mPriority); @@ -233,7 +233,7 @@ bool LLTextureCacheLocalFileWorker::doRead()  // 						<< " Bytes: " << mDataSize << " Offset: " << mOffset  // 						<< " / " << mDataSize << llendl;  				mDataSize = 0; // failed -				delete[] mReadData; +				LLImageBase::deleteMemory(mReadData);  				mReadData = NULL;  			}  			return true; @@ -248,7 +248,7 @@ bool LLTextureCacheLocalFileWorker::doRead()  	{  		mDataSize = local_size;  	} -	mReadData = new U8[mDataSize]; +	mReadData = (U8*)LLImageBase::allocateMemory(mDataSize);  	S32 bytes_read = LLAPRFile::readEx(mFileName, mReadData, mOffset, mDataSize, mCache->getLocalAPRFilePool());	 @@ -258,7 +258,7 @@ bool LLTextureCacheLocalFileWorker::doRead()  // 				<< " Bytes: " << mDataSize << " Offset: " << mOffset  // 				<< " / " << mDataSize << llendl;  		mDataSize = 0; -		delete[] mReadData; +		LLImageBase::deleteMemory(mReadData);  		mReadData = NULL;  	}  	else @@ -371,7 +371,7 @@ bool LLTextureCacheRemoteWorker::doRead()  			mDataSize = local_size;  		}  		// Allocate read buffer -		mReadData = new U8[mDataSize]; +		mReadData = (U8*)LLImageBase::allocateMemory(mDataSize);  		S32 bytes_read = LLAPRFile::readEx(local_filename,   											 mReadData, mOffset, mDataSize, mCache->getLocalAPRFilePool());  		if (bytes_read != mDataSize) @@ -380,7 +380,7 @@ bool LLTextureCacheRemoteWorker::doRead()   					<< " Bytes: " << mDataSize << " Offset: " << mOffset   					<< " / " << mDataSize << llendl;  			mDataSize = 0; -			delete[] mReadData; +			LLImageBase::deleteMemory(mReadData);  			mReadData = NULL;  		}  		else @@ -423,7 +423,7 @@ bool LLTextureCacheRemoteWorker::doRead()  		S32 size = TEXTURE_CACHE_ENTRY_SIZE - mOffset;  		size = llmin(size, mDataSize);  		// Allocate the read buffer -		mReadData = new U8[size]; +		mReadData = (U8*)LLImageBase::allocateMemory(size);  		S32 bytes_read = LLAPRFile::readEx(mCache->mHeaderDataFileName,   											 mReadData, offset, size, mCache->getLocalAPRFilePool());  		if (bytes_read != size) @@ -431,7 +431,7 @@ bool LLTextureCacheRemoteWorker::doRead()  			llwarns << "LLTextureCacheWorker: "  << mID  					<< " incorrect number of bytes read from header: " << bytes_read  					<< " / " << size << llendl; -			delete[] mReadData; +			LLImageBase::deleteMemory(mReadData);  			mReadData = NULL;  			mDataSize = -1; // failed  			done = true; @@ -461,7 +461,7 @@ bool LLTextureCacheRemoteWorker::doRead()  			S32 data_offset, file_size, file_offset;  			// Reserve the whole data buffer first -			U8* data = new U8[mDataSize]; +			U8* data = (U8*)LLImageBase::allocateMemory(mDataSize);  			// Set the data file pointers taking the read offset into account. 2 cases:  			if (mOffset < TEXTURE_CACHE_ENTRY_SIZE) @@ -474,7 +474,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); -				delete[] mReadData; +				LLImageBase::deleteMemory(mReadData);  				mReadData = NULL;  			}  			else @@ -500,7 +500,7 @@ bool LLTextureCacheRemoteWorker::doRead()  				llwarns << "LLTextureCacheWorker: "  << mID  						<< " incorrect number of bytes read from body: " << bytes_read  						<< " / " << file_size << llendl; -				delete[] mReadData; +				LLImageBase::deleteMemory(mReadData);  				mReadData = NULL;  				mDataSize = -1; // failed  				done = true; @@ -592,11 +592,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 = new U8[TEXTURE_CACHE_ENTRY_SIZE]; +			U8* padBuffer = (U8*)LLImageBase::allocateMemory(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()); -			delete [] padBuffer; +			LLImageBase::deleteMemory(padBuffer);  		}  		else  		{ @@ -692,7 +692,7 @@ void LLTextureCacheWorker::finishWork(S32 param, bool completed)  			}  			else  			{ -				delete[] mReadData; +				LLImageBase::deleteMemory(mReadData);  				mReadData = NULL;  			}  		} diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index d6d38de225..510afc6b9b 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -572,7 +572,7 @@ void LLTextureFetchWorker::setImagePriority(F32 priority)  void LLTextureFetchWorker::resetFormattedData()  { -	delete[] mBuffer; +	LLImageBase::deleteMemory(mBuffer);  	mBuffer = NULL;  	mBufferSize = 0;  	if (mFormattedImage.notNull()) @@ -642,7 +642,7 @@ bool LLTextureFetchWorker::doWork(S32 param)  		mSentRequest = UNSENT;  		mDecoded  = FALSE;  		mWritten  = FALSE; -		delete[] mBuffer; +		LLImageBase::deleteMemory(mBuffer);  		mBuffer = NULL;  		mBufferSize = 0;  		mHaveAllData = FALSE; @@ -997,7 +997,7 @@ bool LLTextureFetchWorker::doWork(S32 param)  			llassert_always(mBufferSize == cur_size + mRequestedSize);  			if(!mBufferSize)//no data received.  			{ -				delete[] mBuffer;  +				LLImageBase::deleteMemory(mBuffer);   				mBuffer = NULL;  				//abort. @@ -1025,7 +1025,7 @@ bool LLTextureFetchWorker::doWork(S32 param)  				mFileSize = mBufferSize + 1 ; //flag the file is not fully loaded.  			} -			U8* buffer = new U8[mBufferSize]; +			U8* buffer = (U8*)LLImageBase::allocateMemory(mBufferSize);  			if (cur_size > 0)  			{  				memcpy(buffer, mFormattedImage->getData(), cur_size); @@ -1034,7 +1034,7 @@ bool LLTextureFetchWorker::doWork(S32 param)  			// NOTE: setData releases current data and owns new data (buffer)  			mFormattedImage->setData(buffer, mBufferSize);  			// delete temp data -			delete[] mBuffer; // Note: not 'buffer' (assigned in setData()) +			LLImageBase::deleteMemory(mBuffer); // Note: not 'buffer' (assigned in setData())  			mBuffer = NULL;  			mBufferSize = 0;  			mLoadedDiscard = mRequestedDiscard; @@ -1331,7 +1331,7 @@ bool LLTextureFetchWorker::processSimulatorPackets()  			if (buffer_size > cur_size)  			{  				/// We have new data -				U8* buffer = new U8[buffer_size]; +				U8* buffer = (U8*)LLImageBase::allocateMemory(buffer_size);  				S32 offset = 0;  				if (cur_size > 0 && mFirstPacket > 0)  				{ @@ -1383,7 +1383,7 @@ S32 LLTextureFetchWorker::callbackHttpGet(const LLChannelDescriptors& channels,  		if (data_size > 0)  		{  			// *TODO: set the formatted image data here directly to avoid the copy -			mBuffer = new U8[data_size]; +			mBuffer = (U8*)LLImageBase::allocateMemory(data_size);  			buffer->readAfter(channels.in(), NULL, mBuffer, data_size);  			mBufferSize += data_size;  			if (data_size < mRequestedSize && mRequestedDiscard == 0) | 
