diff --git a/src/libclient/avmodel.cpp b/src/libclient/avmodel.cpp index b6712b73dfeec698462cec71c666329c273b2b1f..aa477673f6cde3b6ebedb21dfb47478949fffb09 100644 --- a/src/libclient/avmodel.cpp +++ b/src/libclient/avmodel.cpp @@ -103,10 +103,12 @@ public: void addRenderer(const QString& id, const QSize& res, const QString& shmPath = {}); /** - * Remove renderer from renderers_ + * Remove renderer from renderers_. If the returned renderer is ignored, it + * will be deleted. * @param id + * @return the renderer */ - void removeRenderer(const QString& id); + std::unique_ptr<Renderer> removeRenderer(const QString& id); bool hasRenderer(const QString& id); QSize getRendererSize(const QString& id); @@ -947,7 +949,7 @@ void AVModelPimpl::addRenderer(const QString& id, const QSize& res, const QString& shmPath) { // Remove the renderer if it already exists. - removeRenderer(id); // Will write-lock renderersMutex_. + std::ignore = removeRenderer(id); { QWriteLocker lk(&renderersMutex_); @@ -955,13 +957,7 @@ AVModelPimpl::addRenderer(const QString& id, const QSize& res, const QString& sh } QReadLocker lk(&renderersMutex_); - auto it = renderers_.find(id); - if (it == renderers_.end()) { - qWarning() << Q_FUNC_INFO << "Renderer not found for id:" << id; - return; - } - - if (auto* renderer = it->second.get()) { + if (auto* renderer = renderers_.find(id)->second.get()) { connect( renderer, &Renderer::fpsChanged, @@ -999,16 +995,18 @@ AVModelPimpl::addRenderer(const QString& id, const QSize& res, const QString& sh } } -void +std::unique_ptr<Renderer> AVModelPimpl::removeRenderer(const QString& id) { QWriteLocker lk(&renderersMutex_); auto it = renderers_.find(id); if (it == renderers_.end()) { qWarning() << "Cannot remove renderer. " << id << "not found"; - return; + return {}; } - renderers_.erase(id); + auto removed = std::move(it->second); + renderers_.erase(it); + return removed; } bool