From 1c37fa0fce36549bd6c939d3a9a4ad149d262a86 Mon Sep 17 00:00:00 2001 From: Siana Gearz Date: Sat, 13 Nov 2010 05:39:09 +0100 Subject: [PATCH] Cache purge queue --- indra/newview/lltexturecache.cpp | 54 ++++++++++++++++++++++++++++++-- indra/newview/lltexturecache.h | 4 +++ 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index ed802aeb1..5744fe54f 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -746,6 +746,7 @@ LLTextureCache::LLTextureCache(bool threaded) LLTextureCache::~LLTextureCache() { + purgeTextureFilesTimeSliced(TRUE); // VWR-3878 - NB - force-flush all pending file deletes } ////////////////////////////////////////////////////////////////////////////// @@ -1384,8 +1385,7 @@ void LLTextureCache::purgeTextures(bool validate) if (purge_entry) { purge_count++; - LL_DEBUGS("TextureCache") << "PURGING: " << filename << LL_ENDL; - LLAPRFile::remove(filename); + mFilesToDelete.push_back(filename); cache_size -= entries[idx].mBodySize; mTexturesSizeTotal -= entries[idx].mBodySize; entries[idx].mBodySize = 0; @@ -1393,6 +1393,8 @@ void LLTextureCache::purgeTextures(bool validate) } } + mTimeLastFileDelete.reset(); + LL_DEBUGS("TextureCache") << "TEXTURE CACHE: Writing Entries: " << num_entries << LL_ENDL; writeEntriesAndClose(entries); @@ -1406,10 +1408,53 @@ void LLTextureCache::purgeTextures(bool validate) LL_INFOS("TextureCache") << "TEXTURE CACHE:" << " PURGED: " << purge_count << " ENTRIES: " << num_entries - << " CACHE SIZE: " << mTexturesSizeTotal / 1024*1024 << " MB" + << " CACHE SIZE: " << mTexturesSizeTotal / 1024 / 1024 << " MB" << llendl; } +void LLTextureCache::purgeTextureFilesTimeSliced(BOOL force_all) +{ + LLMutexLock lock(&mHeaderMutex); + + F32 delay_between_passes = 1.0f; // seconds + F32 max_time_per_pass = 0.1f; // seconds + + if (!force_all && mTimeLastFileDelete.getElapsedTimeF32() <= delay_between_passes) + { + return; + } + + LLTimer timer; + S32 howmany = 0; + + if (!mFilesToDelete.empty()) + { + LL_INFOS("TEXTURE CACHE") << "purging time sliced with " << mFilesToDelete.size() << " files scheduled for deletion" << llendl; + + for (LLTextureCache::filename_list_t::iterator iter = mFilesToDelete.begin(); iter!=mFilesToDelete.end(); ) + { + LLTextureCache::filename_list_t::iterator iter2 = iter++; + LLAPRFile::remove(*iter2); + mFilesToDelete.erase(iter2); + howmany++; + + if (!force_all && timer.getElapsedTimeF32() > max_time_per_pass) + { + break; + } + } + } + + if (!mFilesToDelete.empty()) + { + LL_INFOS("TEXTURE CACHE") << "purging time sliced with " << howmany << " files deleted (" + << mFilesToDelete.size() << " files left for next pass)" + << llendl; + } + + mTimeLastFileDelete.reset(); +} + ////////////////////////////////////////////////////////////////////////////// // call lockWorkers() first! @@ -1561,6 +1606,9 @@ LLTextureCache::handle_t LLTextureCache::writeToCache(const LLUUID& id, U32 prio purgeTextures(false); mDoPurge = FALSE; } + + purgeTextureFilesTimeSliced(); // VWR-3878 - NB - purge textures from cache in a non-hiccup-way + LLMutexLock lock(&mWorkersMutex); LLTextureCacheWorker* worker = new LLTextureCacheRemoteWorker(this, priority, id, data, datasize, 0, diff --git a/indra/newview/lltexturecache.h b/indra/newview/lltexturecache.h index 45804c26b..9f89ecda8 100644 --- a/indra/newview/lltexturecache.h +++ b/indra/newview/lltexturecache.h @@ -147,6 +147,7 @@ private: void readHeaderCache(); void purgeAllTextures(bool purge_directories); void purgeTextures(bool validate); + void purgeTextureFilesTimeSliced(BOOL force_all = FALSE); // VWR-3878 - NB LLAPRFile* openHeaderEntriesFile(bool readonly, S32 offset); void closeHeaderEntriesFile(); void readEntriesHeader(); @@ -176,6 +177,9 @@ private: typedef std::vector, bool> > responder_list_t; responder_list_t mCompletedList; + typedef std::list filename_list_t; + filename_list_t mFilesToDelete; + LLTimer mTimeLastFileDelete; BOOL mReadOnly; // HEADERS (Include first mip)