From 0b11282d88d8c3690886720a59c240c436363b28 Mon Sep 17 00:00:00 2001
From: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>
Date: Mon, 15 May 2023 16:34:39 -0400
Subject: [PATCH] avmodel: hold lock when erasing renderer

Change-Id: If10ad2bf40ce05b0052016123755f4c9dca18097
---
 src/libclient/avmodel.cpp | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/src/libclient/avmodel.cpp b/src/libclient/avmodel.cpp
index 7939563df..50a6b330f 100644
--- a/src/libclient/avmodel.cpp
+++ b/src/libclient/avmodel.cpp
@@ -942,15 +942,12 @@ createRenderer(const QString& id, const QSize& res, const QString& shmPath = {})
 void
 AVModelPimpl::addRenderer(const QString& id, const QSize& res, const QString& shmPath)
 {
-    // First remove the existing renderer.
-    renderers_.erase(id);
+    {
+        std::lock_guard<std::mutex> lk(renderers_mtx_);
+        renderers_[id] = createRenderer(id, res, shmPath);
+    }
 
-    // Create a new one and add it.
-    auto renderer = createRenderer(id, res, shmPath);
-    std::lock_guard<std::mutex> lk(renderers_mtx_);
     auto& r = renderers_[id];
-    r = std::move(renderer);
-    renderers_mtx_.unlock();
 
     // Listen and forward id-bound signals upwards.
     connect(
@@ -965,12 +962,14 @@ AVModelPimpl::addRenderer(const QString& id, const QSize& res, const QString& sh
         this,
         [this, id](const QSize& size) { Q_EMIT linked_.rendererStarted(id, size); },
         Qt::DirectConnection);
+#ifdef ENABLE_LIBWRAP
     connect(
         r.get(),
         &Renderer::frameBufferRequested,
         this,
         [this, id](AVFrame* frame) { Q_EMIT linked_.frameBufferRequested(id, frame); },
         Qt::DirectConnection);
+#endif
     connect(
         r.get(),
         &Renderer::frameUpdated,
-- 
GitLab