diff options
| -rw-r--r-- | indra/newview/llappviewer.cpp | 43 | ||||
| -rw-r--r-- | indra/newview/llappviewer.h | 2 | ||||
| -rw-r--r-- | indra/newview/lltexturecache.cpp | 50 | ||||
| -rw-r--r-- | indra/newview/lltexturecache.h | 3 | 
4 files changed, 77 insertions, 21 deletions
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 11c252406a..cdd553b9b4 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -3000,9 +3000,36 @@ void LLAppViewer::migrateCacheDirectory()  #endif // LL_WINDOWS || LL_DARWIN  } +//static +S32 LLAppViewer::getCacheVersion()  +{ +	static const S32 cache_version = 7; + +	return cache_version ; +} +  bool LLAppViewer::initCache()  {  	mPurgeCache = false; +	BOOL disable_texture_cache = FALSE ; +	BOOL read_only = mSecondInstance ? TRUE : FALSE; +	LLAppViewer::getTextureCache()->setReadOnly(read_only) ; + +	if (gSavedSettings.getS32("LocalCacheVersion") != LLAppViewer::getCacheVersion())  +	{ +		if(read_only)  +		{ +			disable_texture_cache = TRUE ; //if the cache version of this viewer is different from the running one, this viewer can not use the texture cache. +		} +		else +		{ +			mPurgeCache = true; // Purge cache if the version number is different. +			gSavedSettings.setS32("LocalCacheVersion", LLAppViewer::getCacheVersion()); +		} +	} + +	if(!read_only) +	{  	// Purge cache if user requested it  	if (gSavedSettings.getBOOL("PurgeCacheOnStartup") ||  		gSavedSettings.getBOOL("PurgeCacheOnNextStartup")) @@ -3010,16 +3037,6 @@ bool LLAppViewer::initCache()  		gSavedSettings.setBOOL("PurgeCacheOnNextStartup", false);  		mPurgeCache = true;  	} -	// Purge cache if it belongs to an old version -	else -	{ -		static const S32 cache_version = 6; -		if (gSavedSettings.getS32("LocalCacheVersion") != cache_version) -		{ -			mPurgeCache = true; -			gSavedSettings.setS32("LocalCacheVersion", cache_version); -		} -	}  	// We have moved the location of the cache directory over time.  	migrateCacheDirectory(); @@ -3034,6 +3051,7 @@ bool LLAppViewer::initCache()  		gSavedSettings.setString("CacheLocation", new_cache_location);  		gSavedSettings.setString("CacheLocationTopFolder", gDirUtilp->getBaseFileName(new_cache_location));  	} +	}  	if (!gDirUtilp->setCacheDir(gSavedSettings.getString("CacheLocation")))  	{ @@ -3042,7 +3060,7 @@ bool LLAppViewer::initCache()  		gSavedSettings.setString("CacheLocationTopFolder", "");  	} -	if (mPurgeCache) +	if (mPurgeCache && !read_only)  	{  		LLSplashScreen::update(LLTrans::getString("StartupClearingCache"));  		purgeCache(); @@ -3052,13 +3070,12 @@ bool LLAppViewer::initCache()  	// Init the texture cache  	// Allocate 80% of the cache size for textures -	BOOL read_only = mSecondInstance ? TRUE : FALSE;  	const S32 MB = 1024*1024;  	S64 cache_size = (S64)(gSavedSettings.getU32("CacheSize")) * MB;  	const S64 MAX_CACHE_SIZE = 1024*MB;  	cache_size = llmin(cache_size, MAX_CACHE_SIZE);  	S64 texture_cache_size = ((cache_size * 8)/10); -	S64 extra = LLAppViewer::getTextureCache()->initCache(LL_PATH_CACHE, texture_cache_size, read_only); +	S64 extra = LLAppViewer::getTextureCache()->initCache(LL_PATH_CACHE, texture_cache_size, disable_texture_cache);  	texture_cache_size -= extra;  	LLSplashScreen::update(LLTrans::getString("StartupInitializingVFS")); diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index a915b7fa50..60645c46d4 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -102,6 +102,8 @@ public:  	static LLImageDecodeThread* getImageDecodeThread() { return sImageDecodeThread; }  	static LLTextureFetch* getTextureFetch() { return sTextureFetch; } +	static S32 getCacheVersion() ; +  	const std::string& getSerialNumber() { return mSerialNumber; }  	bool getPurgeCache() const { return mPurgeCache; } diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index 7a0712f8aa..290ac8dc04 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -742,7 +742,7 @@ LLTextureCache::LLTextureCache(bool threaded)  	  mHeaderMutex(NULL),  	  mListMutex(NULL),  	  mHeaderAPRFile(NULL), -	  mReadOnly(FALSE), +	  mReadOnly(TRUE), //do not allow to change the texture cache until setReadOnly() is called.  	  mTexturesSizeTotal(0),  	  mDoPurge(FALSE)  { @@ -929,13 +929,16 @@ U32 LLTextureCache::sCacheMaxEntries = MAX_REASONABLE_FILE_SIZE / TEXTURE_CACHE_  S64 LLTextureCache::sCacheMaxTexturesSize = 0; // no limit  const char* entries_filename = "texture.entries";  const char* cache_filename = "texture.cache"; -const char* textures_dirname = "textures"; +const char* old_textures_dirname = "textures"; +//change the location of the texture cache to prevent from being deleted by old version viewers. +const char* textures_dirname = "texturecache";  void LLTextureCache::setDirNames(ELLPath location)  {  	std::string delem = gDirUtilp->getDirDelimiter(); -	mHeaderEntriesFileName = gDirUtilp->getExpandedFilename(location, entries_filename); -	mHeaderDataFileName = gDirUtilp->getExpandedFilename(location, cache_filename); + +	mHeaderEntriesFileName = gDirUtilp->getExpandedFilename(location, textures_dirname, entries_filename); +	mHeaderDataFileName = gDirUtilp->getExpandedFilename(location, textures_dirname, cache_filename);  	mTexturesDirName = gDirUtilp->getExpandedFilename(location, textures_dirname);  } @@ -947,15 +950,37 @@ void LLTextureCache::purgeCache(ELLPath location)  	{  		setDirNames(location);  		llassert_always(mHeaderAPRFile == NULL); -		LLAPRFile::remove(mHeaderEntriesFileName, getLocalAPRFilePool()); -		LLAPRFile::remove(mHeaderDataFileName, getLocalAPRFilePool()); + +		//remove the legacy cache if exists +		std::string texture_dir = mTexturesDirName ; +		mTexturesDirName = gDirUtilp->getExpandedFilename(location, old_textures_dirname); +		if(LLFile::isdir(mTexturesDirName)) +		{ +			std::string file_name = gDirUtilp->getExpandedFilename(location, entries_filename); +			LLAPRFile::remove(file_name, getLocalAPRFilePool()); + +			file_name = gDirUtilp->getExpandedFilename(location, cache_filename); +			LLAPRFile::remove(file_name, getLocalAPRFilePool()); + +			purgeAllTextures(true); +	} +		mTexturesDirName = texture_dir ;  	} + +	//remove the current texture cache.  	purgeAllTextures(true);  } -S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL read_only) +//is called in the main thread before initCache(...) is called. +void LLTextureCache::setReadOnly(BOOL read_only)  {  	mReadOnly = read_only; +} + +//called in the main thread. +S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL disable_texture_cache) +{ +	llassert_always(getPending() == 0) ; //should not start accessing the texture cache before initialized.  	S64 header_size = (max_size * 2) / 10;  	S64 max_entries = header_size / TEXTURE_CACHE_ENTRY_SIZE; @@ -968,6 +993,15 @@ S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL read_only)  		sCacheMaxTexturesSize = max_size;  	max_size -= sCacheMaxTexturesSize; +	if(disable_texture_cache) //the texture cache is disabled +	{ +		llinfos << "The texture cache is disabled!" << llendl ; +		setReadOnly(TRUE) ; +		purgeAllTextures(true);  + +		return max_size ; +	} +  	LL_INFOS("TextureCache") << "Headers: " << sCacheMaxEntries  			<< " Textures size: " << sCacheMaxTexturesSize/(1024*1024) << " MB" << LL_ENDL; @@ -986,6 +1020,8 @@ S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL read_only)  	readHeaderCache();  	purgeTextures(true); // calc mTexturesSize and make some room in the texture cache if we need it +	llassert_always(getPending() == 0) ; //should not start accessing the texture cache before initialized. +  	return max_size; // unused cache space  } diff --git a/indra/newview/lltexturecache.h b/indra/newview/lltexturecache.h index ca8815ee7e..5dc06ff401 100644 --- a/indra/newview/lltexturecache.h +++ b/indra/newview/lltexturecache.h @@ -110,7 +110,8 @@ public:  	/*virtual*/ S32 update(U32 max_time_ms);	  	void purgeCache(ELLPath location); -	S64 initCache(ELLPath location, S64 maxsize, BOOL read_only); +	void setReadOnly(BOOL read_only) ; +	S64 initCache(ELLPath location, S64 maxsize, BOOL disable_texture_cache);  	handle_t readFromCache(const std::string& local_filename, const LLUUID& id, U32 priority, S32 offset, S32 size,  						   ReadResponder* responder);  | 
