Cache purge queue
This commit is contained in:
@@ -746,6 +746,7 @@ LLTextureCache::LLTextureCache(bool threaded)
|
|||||||
|
|
||||||
LLTextureCache::~LLTextureCache()
|
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)
|
if (purge_entry)
|
||||||
{
|
{
|
||||||
purge_count++;
|
purge_count++;
|
||||||
LL_DEBUGS("TextureCache") << "PURGING: " << filename << LL_ENDL;
|
mFilesToDelete.push_back(filename);
|
||||||
LLAPRFile::remove(filename);
|
|
||||||
cache_size -= entries[idx].mBodySize;
|
cache_size -= entries[idx].mBodySize;
|
||||||
mTexturesSizeTotal -= entries[idx].mBodySize;
|
mTexturesSizeTotal -= entries[idx].mBodySize;
|
||||||
entries[idx].mBodySize = 0;
|
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;
|
LL_DEBUGS("TextureCache") << "TEXTURE CACHE: Writing Entries: " << num_entries << LL_ENDL;
|
||||||
|
|
||||||
writeEntriesAndClose(entries);
|
writeEntriesAndClose(entries);
|
||||||
@@ -1406,10 +1408,53 @@ void LLTextureCache::purgeTextures(bool validate)
|
|||||||
LL_INFOS("TextureCache") << "TEXTURE CACHE:"
|
LL_INFOS("TextureCache") << "TEXTURE CACHE:"
|
||||||
<< " PURGED: " << purge_count
|
<< " PURGED: " << purge_count
|
||||||
<< " ENTRIES: " << num_entries
|
<< " ENTRIES: " << num_entries
|
||||||
<< " CACHE SIZE: " << mTexturesSizeTotal / 1024*1024 << " MB"
|
<< " CACHE SIZE: " << mTexturesSizeTotal / 1024 / 1024 << " MB"
|
||||||
<< llendl;
|
<< 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!
|
// call lockWorkers() first!
|
||||||
@@ -1561,6 +1606,9 @@ LLTextureCache::handle_t LLTextureCache::writeToCache(const LLUUID& id, U32 prio
|
|||||||
purgeTextures(false);
|
purgeTextures(false);
|
||||||
mDoPurge = FALSE;
|
mDoPurge = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
purgeTextureFilesTimeSliced(); // VWR-3878 - NB - purge textures from cache in a non-hiccup-way
|
||||||
|
|
||||||
LLMutexLock lock(&mWorkersMutex);
|
LLMutexLock lock(&mWorkersMutex);
|
||||||
LLTextureCacheWorker* worker = new LLTextureCacheRemoteWorker(this, priority, id,
|
LLTextureCacheWorker* worker = new LLTextureCacheRemoteWorker(this, priority, id,
|
||||||
data, datasize, 0,
|
data, datasize, 0,
|
||||||
|
|||||||
@@ -147,6 +147,7 @@ private:
|
|||||||
void readHeaderCache();
|
void readHeaderCache();
|
||||||
void purgeAllTextures(bool purge_directories);
|
void purgeAllTextures(bool purge_directories);
|
||||||
void purgeTextures(bool validate);
|
void purgeTextures(bool validate);
|
||||||
|
void purgeTextureFilesTimeSliced(BOOL force_all = FALSE); // VWR-3878 - NB
|
||||||
LLAPRFile* openHeaderEntriesFile(bool readonly, S32 offset);
|
LLAPRFile* openHeaderEntriesFile(bool readonly, S32 offset);
|
||||||
void closeHeaderEntriesFile();
|
void closeHeaderEntriesFile();
|
||||||
void readEntriesHeader();
|
void readEntriesHeader();
|
||||||
@@ -176,6 +177,9 @@ private:
|
|||||||
typedef std::vector<std::pair<LLPointer<Responder>, bool> > responder_list_t;
|
typedef std::vector<std::pair<LLPointer<Responder>, bool> > responder_list_t;
|
||||||
responder_list_t mCompletedList;
|
responder_list_t mCompletedList;
|
||||||
|
|
||||||
|
typedef std::list<std::string> filename_list_t;
|
||||||
|
filename_list_t mFilesToDelete;
|
||||||
|
LLTimer mTimeLastFileDelete;
|
||||||
BOOL mReadOnly;
|
BOOL mReadOnly;
|
||||||
|
|
||||||
// HEADERS (Include first mip)
|
// HEADERS (Include first mip)
|
||||||
|
|||||||
Reference in New Issue
Block a user