From 09a3ce39b9735f187fdbaf063bbd4e6c477e3c5a Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Fri, 10 Jun 2022 12:12:03 -0700 Subject: [PATCH] rendermanager: reimplement clearing old decoders --- app/render/rendermanager.cpp | 24 ++++++++++++++++++++++++ app/render/rendermanager.h | 5 +++++ 2 files changed, 29 insertions(+) diff --git a/app/render/rendermanager.cpp b/app/render/rendermanager.cpp index 9710aa626..e897c77e2 100644 --- a/app/render/rendermanager.cpp +++ b/app/render/rendermanager.cpp @@ -59,6 +59,11 @@ RenderManager::RenderManager(QObject *parent) : context_ = nullptr; decoder_cache_ = nullptr; } + + QTimer *decoder_clear_timer = new QTimer(this); + decoder_clear_timer->setInterval(kDecoderMaximumInactivity); + connect(decoder_clear_timer, &QTimer::timeout, this, &RenderManager::ClearOldDecoders); + decoder_clear_timer->start(); } RenderManager::~RenderManager() @@ -157,4 +162,23 @@ void RenderManager::RunTicket(RenderTicketPtr ticket) const RenderProcessor::Process(ticket, context_, decoder_cache_, shader_cache_); } +void RenderManager::ClearOldDecoders() +{ + QMutexLocker locker(decoder_cache_->mutex()); + + qint64 min_age = QDateTime::currentMSecsSinceEpoch() - kDecoderMaximumInactivity; + + for (auto it=decoder_cache_->begin(); it!=decoder_cache_->end(); ) { + DecoderPair decoder = it.value(); + + if (decoder.decoder->GetLastAccessedTime() < min_age) { + qDebug() << "Cleared old decoder"; + decoder.decoder->Close(); + it = decoder_cache_->erase(it); + } else { + it++; + } + } +} + } diff --git a/app/render/rendermanager.h b/app/render/rendermanager.h index 2cf6b22a7..24d29e34a 100644 --- a/app/render/rendermanager.h +++ b/app/render/rendermanager.h @@ -130,6 +130,11 @@ private: ShaderCache* shader_cache_; + static constexpr auto kDecoderMaximumInactivity = 10000; + +private slots: + void ClearOldDecoders(); + }; }