aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/linden/indra/newview/lltexturecache.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'linden/indra/newview/lltexturecache.cpp')
-rw-r--r--linden/indra/newview/lltexturecache.cpp68
1 files changed, 62 insertions, 6 deletions
diff --git a/linden/indra/newview/lltexturecache.cpp b/linden/indra/newview/lltexturecache.cpp
index ce35377..8044859 100644
--- a/linden/indra/newview/lltexturecache.cpp
+++ b/linden/indra/newview/lltexturecache.cpp
@@ -892,6 +892,8 @@ LLTextureCache::LLTextureCache(bool threaded)
892 892
893LLTextureCache::~LLTextureCache() 893LLTextureCache::~LLTextureCache()
894{ 894{
895 purgeTextureFilesTimeSliced(TRUE); // force-flush all pending file deletes
896
895 apr_pool_destroy(mFileAPRPool); 897 apr_pool_destroy(mFileAPRPool);
896} 898}
897 899
@@ -1196,7 +1198,7 @@ void LLTextureCache::purgeTextures(bool validate)
1196 return; 1198 return;
1197 } 1199 }
1198 1200
1199 LL_DEBUGS("TextureCache") << "TEXTURE CACHE: Reading Entries..." << LL_ENDL; 1201 LL_DEBUGS("TextureCache") << "TEXTURE CACHE: Reading " << num_entries << " Entries from " << mTexturesDirEntriesFileName << LL_ENDL;
1200 1202
1201 std::map<LLUUID, S32> entry_idx_map; 1203 std::map<LLUUID, S32> entry_idx_map;
1202 S64 total_size = 0; 1204 S64 total_size = 0;
@@ -1225,7 +1227,7 @@ void LLTextureCache::purgeTextures(bool validate)
1225 LL_DEBUGS("TextureCache") << "TEXTURE CACHE: Validating: " << validate_idx << LL_ENDL; 1227 LL_DEBUGS("TextureCache") << "TEXTURE CACHE: Validating: " << validate_idx << LL_ENDL;
1226 } 1228 }
1227 1229
1228 S64 min_cache_size = (sCacheMaxTexturesSize * 9) / 10; 1230 S64 min_cache_size = sCacheMaxTexturesSize / 100 * 95;
1229 S32 purge_count = 0; 1231 S32 purge_count = 0;
1230 S32 next_idx = 0; 1232 S32 next_idx = 0;
1231 for (S32 idx=0; idx<num_entries; idx++) 1233 for (S32 idx=0; idx<num_entries; idx++)
@@ -1259,8 +1261,8 @@ void LLTextureCache::purgeTextures(bool validate)
1259 if (purge_entry) 1261 if (purge_entry)
1260 { 1262 {
1261 purge_count++; 1263 purge_count++;
1262 LL_DEBUGS("TextureCache") << "PURGING: " << filename << LL_ENDL; 1264 LL_DEBUGS("TextureCache") << "PURGING: " << filename << LL_ENDL;
1263 ll_apr_file_remove(filename, NULL); 1265 mFilesToDelete.push_back(filename);
1264 total_size -= entries[idx].mSize; 1266 total_size -= entries[idx].mSize;
1265 entries[idx].mSize = 0; 1267 entries[idx].mSize = 0;
1266 } 1268 }
@@ -1275,7 +1277,11 @@ void LLTextureCache::purgeTextures(bool validate)
1275 } 1277 }
1276 num_entries = next_idx; 1278 num_entries = next_idx;
1277 1279
1278 LL_DEBUGS("TextureCache") << "TEXTURE CACHE: Writing Entries: " << num_entries << LL_ENDL; 1280 mTimeLastFileDelete.reset();
1281
1282 LL_DEBUGS("TextureCache") << "TEXTURE CACHE: Writing Entries: "
1283 << num_entries << " (" << num_entries*sizeof(Entry)/1024 << "KB)"
1284 << LL_ENDL;
1279 1285
1280 ll_apr_file_remove(mTexturesDirEntriesFileName, NULL); 1286 ll_apr_file_remove(mTexturesDirEntriesFileName, NULL);
1281 ll_apr_file_write_ex(mTexturesDirEntriesFileName, NULL, 1287 ll_apr_file_write_ex(mTexturesDirEntriesFileName, NULL,
@@ -1298,10 +1304,56 @@ void LLTextureCache::purgeTextures(bool validate)
1298 LL_INFOS("TextureCache") << "TEXTURE CACHE:" 1304 LL_INFOS("TextureCache") << "TEXTURE CACHE:"
1299 << " PURGED: " << purge_count 1305 << " PURGED: " << purge_count
1300 << " ENTRIES: " << num_entries 1306 << " ENTRIES: " << num_entries
1301 << " CACHE SIZE: " << total_size / 1024*1024 << " MB" 1307 << " CACHE SIZE: " << total_size/1024/1024 << " MB"
1302 << llendl; 1308 << llendl;
1303} 1309}
1304 1310
1311
1312void LLTextureCache::purgeTextureFilesTimeSliced(BOOL force_all)
1313{
1314 LLMutexLock lock(&mHeaderMutex);
1315
1316 F32 delay_between_passes = 1.0f; // seconds
1317 F32 max_time_per_pass = 0.1f; // seconds
1318
1319 if (!force_all && mTimeLastFileDelete.getElapsedTimeF32() <= delay_between_passes)
1320 {
1321 return;
1322 }
1323
1324 LLTimer timer;
1325 S32 howmany = 0;
1326
1327 if (mFilesToDelete.size() > 0)
1328 {
1329 llinfos << "TEXTURE CACHE: " << mFilesToDelete.size() << " files scheduled for deletion" << llendl;
1330 }
1331
1332 for (LLTextureCache::filename_list_t::iterator iter = mFilesToDelete.begin(); iter!=mFilesToDelete.end(); )
1333 {
1334 LLTextureCache::filename_list_t::iterator iter2 = iter++;
1335 ll_apr_file_remove(*iter2, NULL);
1336 mFilesToDelete.erase(iter2);
1337 howmany++;
1338
1339 if (!force_all && timer.getElapsedTimeF32() > max_time_per_pass)
1340 {
1341 break;
1342 }
1343 }
1344
1345 if (!mFilesToDelete.empty())
1346 {
1347 llinfos << "TEXTURE CACHE: "<< howmany << " files deleted ("
1348 << mFilesToDelete.size() << " files left for next pass)"
1349 << llendl;
1350 }
1351
1352 mTimeLastFileDelete.reset();
1353}
1354
1355
1356
1305////////////////////////////////////////////////////////////////////////////// 1357//////////////////////////////////////////////////////////////////////////////
1306 1358
1307// call lockWorkers() first! 1359// call lockWorkers() first!
@@ -1471,6 +1523,10 @@ LLTextureCache::handle_t LLTextureCache::writeToCache(const LLUUID& id, U32 prio
1471 purgeTextures(false); 1523 purgeTextures(false);
1472 mDoPurge = FALSE; 1524 mDoPurge = FALSE;
1473 } 1525 }
1526
1527 purgeTextureFilesTimeSliced(); // purge textures from cache in a non-hiccup-way
1528
1529
1474 if (datasize >= TEXTURE_CACHE_ENTRY_SIZE) 1530 if (datasize >= TEXTURE_CACHE_ENTRY_SIZE)
1475 { 1531 {
1476 LLMutexLock lock(&mWorkersMutex); 1532 LLMutexLock lock(&mWorkersMutex);