From 637b6673bcceb90783b674ed90217143ecb48fe3 Mon Sep 17 00:00:00 2001 From: Steve Bennetts Date: Sat, 14 Nov 2009 10:22:32 -0800 Subject: More texture cache fixes, including a possible deadlock when the cache was getting purged. Significantly reduced spurrious warnings and delition of non sin-based texture fetch comptabable sided cache files. --- indra/newview/lltexturecache.cpp | 43 ++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 17 deletions(-) (limited to 'indra/newview/lltexturecache.cpp') diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp index 2e2f342cca..4f199e9da4 100644 --- a/indra/newview/lltexturecache.cpp +++ b/indra/newview/lltexturecache.cpp @@ -1002,7 +1002,7 @@ void LLTextureCache::closeHeaderEntriesFile() void LLTextureCache::readEntriesHeader() { // mHeaderEntriesInfo initializes to default values so safe not to read it - llassert_always(mHeaderAPRFile == NULL); + llassert_always(mHeaderAPRFile == NULL); if (LLAPRFile::isExist(mHeaderEntriesFileName, getLocalAPRFilePool())) { LLAPRFile::readEx(mHeaderEntriesFileName, (U8*)&mHeaderEntriesInfo, 0, sizeof(EntriesInfo), @@ -1192,7 +1192,7 @@ void LLTextureCache::writeEntriesAndClose(const std::vector& entries) // Called from either the main thread or the worker thread void LLTextureCache::readHeaderCache() { - LLMutexLock lock(&mHeaderMutex); + mHeaderMutex.lock(); mLRU.clear(); // always clear the LRU @@ -1214,14 +1214,14 @@ void LLTextureCache::readHeaderCache() U32 empty_entries = 0; typedef std::pair lru_data_t; std::set lru; - std::vector purge_list; + std::set purge_list; for (U32 i=0; i::iterator iter = lru.begin(); iter != lru.end(); ++iter) { - purge_list.push_back(iter->second); - if (--entries_to_purge <= 0) - break; + S32 idx = iter->second; + if (entries[idx].mImageSize >= 0) + { + purge_list.insert(entries[idx].mID); + entries[idx].mImageSize = -1; + if (purge_list.size() >= entries_to_purge) + break; + } } } - llassert_always(entries_to_purge <= 0); - llassert_always(purge_list.size() == entries_to_purge); + llassert_always(purge_list.size() >= entries_to_purge); } else { @@ -1272,11 +1277,9 @@ void LLTextureCache::readHeaderCache() if (purge_list.size() > 0) { - for (std::vector::iterator iter = purge_list.begin(); iter != purge_list.end(); ++iter) + for (std::set::iterator iter = purge_list.begin(); iter != purge_list.end(); ++iter) { - S32 idx = *iter; - const LLUUID& id = entries[idx].mID; - entries[idx].mImageSize = -1; // set cached entry size to -1 + const LLUUID& id = *iter; bool res = removeHeaderCacheEntry(id); // sets entry size on disk to -1 llassert_always(res); LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool()); @@ -1295,7 +1298,9 @@ void LLTextureCache::readHeaderCache() llassert_always(new_entries.size() <= sCacheMaxEntries); mHeaderEntriesInfo.mEntries = new_entries.size(); writeEntriesAndClose(new_entries); + mHeaderMutex.unlock(); // unlock the mutex before calling again readHeaderCache(); // repeat with new entries file + mHeaderMutex.lock(); } else { @@ -1303,6 +1308,7 @@ void LLTextureCache::readHeaderCache() } } } + mHeaderMutex.unlock(); } ////////////////////////////////////////////////////////////////////////////// @@ -1348,9 +1354,12 @@ void LLTextureCache::purgeTextures(bool validate) return; } - // *FIX:Mani - watchdog off. - LLAppViewer::instance()->pauseMainloopTimeout(); - + if (!mThreaded) + { + // *FIX:Mani - watchdog off. + LLAppViewer::instance()->pauseMainloopTimeout(); + } + LLMutexLock lock(&mHeaderMutex); llinfos << "TEXTURE CACHE: Purging." << llendl; -- cgit v1.2.3