diff options
Diffstat (limited to 'linden/indra/newview/lltexturecache.cpp')
-rw-r--r-- | linden/indra/newview/lltexturecache.cpp | 68 |
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 | ||
893 | LLTextureCache::~LLTextureCache() | 893 | LLTextureCache::~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 | |||
1312 | void 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); |