From 3f85ce8a7ad8ba06185b62c67bd319495d416fa1 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 25 Jan 2020 12:18:46 +1100 Subject: [PATCH] diskmanager: clearing disk cache at runtime will correctly signal renderers Clearing the disk cache in the preferences will correctly communicate to renderers that those frames are now deleted. --- app/CMakeLists.txt | 14 +++++++++- .../preferences/tabs/preferencesdisktab.cpp | 2 +- app/render/backend/videorenderbackend.cpp | 4 +-- app/render/backend/videorenderbackend.h | 2 +- app/render/backend/videorenderworker.cpp | 4 +-- app/render/backend/videorenderworker.h | 2 +- app/render/diskmanager.cpp | 28 ++++++++++++++++--- app/render/diskmanager.h | 2 +- 8 files changed, 45 insertions(+), 13 deletions(-) diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 17f99087d..704a9ab28 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -64,7 +64,19 @@ endif() target_compile_definitions(${OLIVE_TARGET} PRIVATE ${OLIVE_DEFINITIONS}) if(MSVC) - target_compile_options(${OLIVE_TARGET} PRIVATE /WX /W4 /wd4127 /wd4456 /wd4706 /experimental:external /external:anglebrackets /external:W0 "$<$:/O2>") + target_compile_options( + ${OLIVE_TARGET} + PRIVATE + /WX + /W4 + /wd4127 + /wd4456 + /wd4706 + /experimental:external + /external:anglebrackets + /external:W0 + "$<$:/O2>" + ) else() target_compile_options(${OLIVE_TARGET} PRIVATE -O2 -Werror -Wuninitialized -pedantic-errors -Wall -Wextra -Wconversion -Wsign-conversion) endif() diff --git a/app/dialog/preferences/tabs/preferencesdisktab.cpp b/app/dialog/preferences/tabs/preferencesdisktab.cpp index bf43fdcf2..77cc5ed76 100644 --- a/app/dialog/preferences/tabs/preferencesdisktab.cpp +++ b/app/dialog/preferences/tabs/preferencesdisktab.cpp @@ -112,7 +112,7 @@ void PreferencesDiskTab::ClearDiskCache() tr("Clear Disk Cache"), tr("Are you sure you want to clear the disk cache in '%1'?").arg(Config::Current()["DiskCachePath"].toString()), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { - if (DiskManager::instance()->ClearDiskCache()) { + if (DiskManager::instance()->ClearDiskCache(false)) { QMessageBox::information(this, tr("Clear Disk Cache"), tr("Disk cache cleared successfully"), diff --git a/app/render/backend/videorenderbackend.cpp b/app/render/backend/videorenderbackend.cpp index 985857f46..3bb9349ea 100644 --- a/app/render/backend/videorenderbackend.cpp +++ b/app/render/backend/videorenderbackend.cpp @@ -303,14 +303,14 @@ void VideoRenderBackend::ThreadCompletedFrame(NodeDependency path, qint64 job_ti } } -void VideoRenderBackend::ThreadCompletedDownload(NodeDependency dep, qint64 job_time, QByteArray hash) +void VideoRenderBackend::ThreadCompletedDownload(NodeDependency dep, qint64 job_time, QByteArray hash, bool texture_existed) { SetWorkerBusyState(static_cast(sender()), false); SetFrameHash(dep, hash, job_time); // Register frame with the disk manager - if (operating_mode_ & VideoRenderWorker::kDownloadOnly) { + if (texture_existed && operating_mode_ & VideoRenderWorker::kDownloadOnly) { DiskManager::instance()->CreatedFile(frame_cache()->CachePathName(hash, params_.format()), hash); } diff --git a/app/render/backend/videorenderbackend.h b/app/render/backend/videorenderbackend.h index 30e949f84..5e2bccda6 100644 --- a/app/render/backend/videorenderbackend.h +++ b/app/render/backend/videorenderbackend.h @@ -140,7 +140,7 @@ private: private slots: void ThreadCompletedFrame(NodeDependency path, qint64 job_time, QByteArray hash, QVariant value); - void ThreadCompletedDownload(NodeDependency dep, qint64 job_time, QByteArray hash); + void ThreadCompletedDownload(NodeDependency dep, qint64 job_time, QByteArray hash, bool texture_existed); void ThreadSkippedFrame(NodeDependency dep, qint64 job_time, QByteArray hash); void ThreadHashAlreadyExists(NodeDependency dep, qint64 job_time, QByteArray hash); diff --git a/app/render/backend/videorenderworker.cpp b/app/render/backend/videorenderworker.cpp index b4f6fadb9..b50279ee4 100644 --- a/app/render/backend/videorenderworker.cpp +++ b/app/render/backend/videorenderworker.cpp @@ -47,7 +47,7 @@ NodeValueTable VideoRenderWorker::RenderInternal(const NodeDependency& path, con if (!(operating_mode_ & kRenderOnly)) { // Emit only the hash - emit CompletedDownload(path, job_time, hash); + emit CompletedDownload(path, job_time, hash, false); } else if ((operating_mode_ & kHashOnly) && frame_cache_->HasHash(hash, video_params_.format())) { @@ -74,7 +74,7 @@ NodeValueTable VideoRenderWorker::RenderInternal(const NodeDependency& path, con if (operating_mode_ & kDownloadOnly) { // Signal that this job is complete - emit CompletedDownload(path, job_time, hash); + emit CompletedDownload(path, job_time, hash, !texture.isNull()); } } else { diff --git a/app/render/backend/videorenderworker.h b/app/render/backend/videorenderworker.h index 28042a89f..cfaa947de 100644 --- a/app/render/backend/videorenderworker.h +++ b/app/render/backend/videorenderworker.h @@ -50,7 +50,7 @@ public: signals: void CompletedFrame(NodeDependency path, qint64 job_time, QByteArray hash, QVariant value); - void CompletedDownload(NodeDependency path, qint64 job_time, QByteArray hash); + void CompletedDownload(NodeDependency path, qint64 job_time, QByteArray hash, bool texture_existed); void HashAlreadyBeingCached(NodeDependency path, qint64 job_time, QByteArray hash); diff --git a/app/render/diskmanager.cpp b/app/render/diskmanager.cpp index 5dd8937ec..a27ab55e2 100644 --- a/app/render/diskmanager.cpp +++ b/app/render/diskmanager.cpp @@ -41,7 +41,7 @@ DiskManager::~DiskManager() { if (Config::Current()["ClearDiskCacheOnClose"].toBool()) { // Clear all cache data - ClearDiskCache(); + ClearDiskCache(true); } else { // Save current cache index QFile cache_index_file(GetCacheIndexFilename()); @@ -142,13 +142,33 @@ void DiskManager::CreatedFile(const QString &file_name, const QByteArray &hash) } } -bool DiskManager::ClearDiskCache() +bool DiskManager::ClearDiskCache(bool quick_delete) { + bool deleted_files; + lock_.lock(); - bool deleted_files = QDir(GetMediaCacheLocation()).removeRecursively(); + if (quick_delete) { + deleted_files = QDir(GetMediaCacheLocation()).removeRecursively(); - disk_data_.clear(); + disk_data_.clear(); + } else { + deleted_files = true; + + for (int i=0;i