--- linden-orig/indra/newview/lltexturecache.h	2007-09-20 12:36:50.000000000 +0200
+++ linden/indra/newview/lltexturecache.h	2007-09-24 21:54:54.531250000 +0200
@@ -111,6 +114,7 @@
 	void readHeaderCache(apr_pool_t* poolp = NULL);
 	void purgeAllTextures(bool purge_directories);
 	void purgeTextures(bool validate);
+	void purgeTextureFilesTimeSliced(BOOL force_all = FALSE);
 	S32 getHeaderCacheEntry(const LLUUID& id, bool touch, S32* imagesize = NULL);
 	bool removeHeaderCacheEntry(const LLUUID& id);
 	void lockHeaders() { mHeaderMutex.lock(); }
@@ -132,6 +136,10 @@
 
 	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;
 	
--- linden-orig/indra/newview/lltexturecache.cpp	2007-09-20 12:36:50.000000000 +0200
+++ linden/indra/newview/lltexturecache.cpp	2007-09-24 21:54:54.500000000 +0200
@@ -736,6 +736,8 @@
 
 LLTextureCache::~LLTextureCache()
 {
+	purgeTextureFilesTimeSliced(TRUE); // force-flush all pending file deletes
+
 	apr_pool_destroy(mFileAPRPool);
 }
 
@@ -1038,14 +1040,14 @@
 		return;
 	}
 	
-	llinfos << "TEXTURE CACHE: Reading Entries..." << llendl;
+	llinfos << "TEXTURE CACHE: Reading " << num_entries << " Entries from " << mTexturesDirEntriesFileName << llendl;
 	
 	std::map<LLUUID, S32> entry_idx_map;
 	S64 total_size = 0;
 	for (S32 idx=0; idx<num_entries; idx++)
 	{
 		const LLUUID& id = entries[idx].mID;
-// 		llinfos << "Entry: " << id << " Size: " << entries[i].mSize << " Time: " << entries[i].mTime << llendl;
+// 		llinfos << "Entry: " << id << " Size: " << entries[idx].mSize << " Time: " << entries[idx].mTime << llendl;
 		std::map<LLUUID, S32>::iterator iter = entry_idx_map.find(id);
 		if (iter != entry_idx_map.end())
 		{
@@ -1067,7 +1069,7 @@
 		llinfos << "TEXTURE CACHE: Validating: " << validate_idx << llendl;
 	}
 	
-	S64 min_cache_size = (sCacheMaxTexturesSize * 9) / 10;
+	S64 min_cache_size = sCacheMaxTexturesSize / 100 * 95;
 	S32 purge_count = 0;
 	S32 next_idx = 0;
 	for (S32 idx=0; idx<num_entries; idx++)
@@ -1101,8 +1103,8 @@
 		if (purge_entry)
 		{
 			purge_count++;
-//	 		llinfos << "PURGING: " << filename << llendl;
-			ll_apr_file_remove(filename, NULL);
+			// llinfos << "PURGING: " << filename << llendl;
+			mFilesToDelete.push_back(filename); 
 			total_size -= entries[idx].mSize;
 			entries[idx].mSize = 0;
 		}
@@ -1117,7 +1119,11 @@
 	}
 	num_entries = next_idx;
 
-	llinfos << "TEXTURE CACHE: Writing Entries: " << num_entries << llendl;
+	mTimeLastFileDelete.reset();
+
+	llinfos << "TEXTURE CACHE: Writing Entries: " << num_entries 
+			<< " (" << num_entries*sizeof(Entry)/1024 << "KB)" 
+			<< llendl;
 	
 	ll_apr_file_remove(mTexturesDirEntriesFileName, NULL);
 	ll_apr_file_write_ex(mTexturesDirEntriesFileName, NULL,
@@ -1137,10 +1143,53 @@
 	llinfos << "TEXTURE CACHE:"
 			<< " PURGED: " << purge_count
 			<< " ENTRIES: " << num_entries
-			<< " CACHE SIZE: " << total_size / 1024*1024 << " MB"
+			<< " CACHE SIZE: " << total_size/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;
+
+	llinfos << "TEXTURE CACHE: " << 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++;
+		ll_apr_file_remove(*iter2, NULL);
+		mFilesToDelete.erase(iter2);
+		howmany++;
+
+		if (!force_all && timer.getElapsedTimeF32() > max_time_per_pass) 
+		{
+			break;
+		}
+	}
+
+	if (!mFilesToDelete.empty())
+	{
+		llinfos << "TEXTURE CACHE: "<< howmany << " files deleted (" 
+				<< mFilesToDelete.size() << " files left for next pass)" 
+				<< llendl;
+	}
+
+	mTimeLastFileDelete.reset();
+}
+
+
+
 //////////////////////////////////////////////////////////////////////////////
 
 // call lockWorkers() first!
