Cache purge queue

This commit is contained in:
Siana Gearz
2010-11-13 05:39:09 +01:00
parent dcb1155033
commit 1c37fa0fce
2 changed files with 55 additions and 3 deletions

View File

@@ -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,

View File

@@ -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<std::pair<LLPointer<Responder>, bool> > responder_list_t;
responder_list_t mCompletedList;
typedef std::list<std::string> filename_list_t;
filename_list_t mFilesToDelete;
LLTimer mTimeLastFileDelete;
BOOL mReadOnly;
// HEADERS (Include first mip)