diff --git a/indra/llfilesystem/lldiskcache.cpp b/indra/llfilesystem/lldiskcache.cpp
index 730a5500cf..2de516c958 100644
--- a/indra/llfilesystem/lldiskcache.cpp
+++ b/indra/llfilesystem/lldiskcache.cpp
@@ -369,3 +369,27 @@ uintmax_t LLDiskCache::dirFileSize(const std::string dir)
return total_file_size;
}
+
+// Regular disk cache cleanup
+FSPurgeDiskCacheThread::FSPurgeDiskCacheThread() :
+ LLThread("PurgeDiskCacheThread", nullptr)
+{
+}
+
+void FSPurgeDiskCacheThread::run()
+{
+ constexpr F64 CHECK_INTERVAL = 60;
+ mTimer.setTimerExpirySec(CHECK_INTERVAL);
+ mTimer.start();
+
+ do
+ {
+ if (mTimer.checkExpirationAndReset(CHECK_INTERVAL))
+ {
+ LLDiskCache::instance().purge();
+ }
+
+ ms_sleep(100);
+ } while (!isQuitting());
+}
+//
diff --git a/indra/llfilesystem/lldiskcache.h b/indra/llfilesystem/lldiskcache.h
index d3eb91e2ad..a30b948cb9 100644
--- a/indra/llfilesystem/lldiskcache.h
+++ b/indra/llfilesystem/lldiskcache.h
@@ -188,4 +188,17 @@ class LLDiskCache :
bool mEnableCacheDebugInfo;
};
+// Regular disk cache cleanup
+class FSPurgeDiskCacheThread : public LLThread
+{
+public:
+ FSPurgeDiskCacheThread::FSPurgeDiskCacheThread();
+
+protected:
+ void run() override;
+
+private:
+ LLTimer mTimer;
+};
+//
#endif // _LLDISKCACHE
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index fa190721bd..73f670b2f8 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -735,6 +735,7 @@ LLAppViewer* LLAppViewer::sInstance = NULL;
LLTextureCache* LLAppViewer::sTextureCache = NULL;
LLImageDecodeThread* LLAppViewer::sImageDecodeThread = NULL;
LLTextureFetch* LLAppViewer::sTextureFetch = NULL;
+FSPurgeDiskCacheThread* LLAppViewer::sPurgeDiskCacheThread = NULL; // Regular disk cache cleanup
std::string getRuntime()
{
@@ -2442,6 +2443,7 @@ bool LLAppViewer::cleanup()
sTextureFetch->shutdown();
sTextureCache->shutdown();
sImageDecodeThread->shutdown();
+ sPurgeDiskCacheThread->shutdown(); // Regular disk cache cleanup
sTextureFetch->shutDownTextureCacheThread() ;
sTextureFetch->shutDownImageDecodeThread() ;
@@ -2464,6 +2466,10 @@ bool LLAppViewer::cleanup()
sImageDecodeThread = NULL;
delete mFastTimerLogThread;
mFastTimerLogThread = NULL;
+ // Regular disk cache cleanup
+ delete sPurgeDiskCacheThread;
+ sPurgeDiskCacheThread = NULL;
+ //
if (LLFastTimerView::sAnalyzePerformance)
{
@@ -2584,6 +2590,7 @@ bool LLAppViewer::initThreads()
sImageDecodeThread,
enable_threads && true,
app_metrics_qa_mode);
+ LLAppViewer::sPurgeDiskCacheThread = new FSPurgeDiskCacheThread(); // Regular disk cache cleanup
if (LLTrace::BlockTimer::sLog || LLTrace::BlockTimer::sMetricLog)
{
@@ -5059,6 +5066,8 @@ bool LLAppViewer::initCache()
LLDiskCache::getInstance()->purge();
}
}
+ // Regular disk cache cleanup
+ LLAppViewer::getPurgeDiskCacheThread()->start();
// FIRE-13066
if (mPurgeTextures && !read_only)
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index 400c4b494a..9d6801c27d 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -59,6 +59,7 @@ class LLTextureFetch;
class LLWatchdogTimeout;
class LLViewerJoystick;
class LLViewerRegion; //
+class FSPurgeDiskCacheThread; // Regular disk cache cleanup
extern LLTrace::BlockTimerStatHandle FTM_FRAME;
@@ -118,6 +119,7 @@ public:
static LLTextureCache* getTextureCache() { return sTextureCache; }
static LLImageDecodeThread* getImageDecodeThread() { return sImageDecodeThread; }
static LLTextureFetch* getTextureFetch() { return sTextureFetch; }
+ static FSPurgeDiskCacheThread* getPurgeDiskCacheThread() { return sPurgeDiskCacheThread; } // Regular disk cache cleanup
static U32 getTextureCacheVersion() ;
static U32 getObjectCacheVersion() ;
@@ -307,6 +309,7 @@ private:
static LLTextureCache* sTextureCache;
static LLImageDecodeThread* sImageDecodeThread;
static LLTextureFetch* sTextureFetch;
+ static FSPurgeDiskCacheThread* sPurgeDiskCacheThread; // Regular disk cache cleanup
S32 mNumSessions;