[vlc-commits] [Git][videolan/vlc][master] 2 commits: qt: dcomp: fix assertion failure at start with `vlc://quit`

Steve Lhomme (@robUx4) gitlab at videolan.org
Sat Jul 4 09:01:33 UTC 2026



Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
9607e715 by Fatih Uzunoglu at 2026-07-04T08:51:18+00:00
qt: dcomp: fix assertion failure at start with `vlc://quit`

- - - - -
11f6b0a3 by Fatih Uzunoglu at 2026-07-04T08:51:18+00:00
qt: do not call `libvlc_Quit()` again if it was already called

- - - - -


3 changed files:

- modules/gui/qt/dialogs/dialogs_provider.cpp
- modules/gui/qt/maininterface/compositor_dcomp.cpp
- modules/gui/qt/maininterface/compositor_dcomp.hpp


Changes:

=====================================
modules/gui/qt/dialogs/dialogs_provider.cpp
=====================================
@@ -127,6 +127,8 @@ QVariant DialogsProvider::getTextDialog(QWidget *parent,
 
 void DialogsProvider::quit()
 {
+    if (b_isDying)
+        return;
     b_isDying = true;
     assert(qApp);
     qApp->setProperty("isDying", true);


=====================================
modules/gui/qt/maininterface/compositor_dcomp.cpp
=====================================
@@ -180,8 +180,21 @@ bool CompositorDirectComposition::init()
     return true;
 }
 
-void CompositorDirectComposition::setup()
+bool CompositorDirectComposition::setup()
 {
+    // WARNING: This lock is released explicitly as soon as we are ready to signal readiness:
+    QMutexLocker lock(&m_setupStateLock);
+
+    switch (m_setupState)
+    {
+    /* [[unlikely]] */ case SetupState::Fail:
+        return false;
+    /* [[unlikely]] */ case SetupState::Success:
+        return true; // Already called
+    /* [[likely]] */ default:
+        break;
+    }
+
     //Setup shouldn't be called once we are shutting down
     assert(m_mainCtx);
     assert(m_quickView);
@@ -231,11 +244,9 @@ void CompositorDirectComposition::setup()
     res = m_rootVisual->AddVisual(m_uiVisual, FALSE, NULL);
     assert(res == S_OK);
 
-    {
-        QMutexLocker lock(&m_setupStateLock);
-        m_setupState = SetupState::Success;
-        m_setupStateCond.notify_all();
-    }
+    m_setupState = SetupState::Success;
+    m_setupStateCond.notify_all();
+    lock.unlock();
 
     m_dcompDevice->Commit();
 
@@ -259,6 +270,8 @@ void CompositorDirectComposition::setup()
             }, Qt::QueuedConnection);
         }
     }
+
+    return true;
 }
 
 void CompositorDirectComposition::cleanup()
@@ -302,7 +315,14 @@ bool CompositorDirectComposition::makeMainInterface(MainCtx* mainCtx, std::funct
     connect(quickViewPtr,
             &QQuickWindow::frameSwapped, // At this stage, we can be sure that QRhi and QRhiSwapChain are valid.
             this,
-            &CompositorDirectComposition::setup,
+            [this]() {
+                if (!setup())
+                {
+                    // Similar to `QQuickWindow::sceneGraphError()` handling:
+                    if (m_mainCtx)
+                        m_mainCtx->askToQuit();
+                }
+            },
             Qt::SingleShotConnection);
 
     {
@@ -410,7 +430,7 @@ void CompositorDirectComposition::unloadGUI()
         QMutexLocker lock(&m_setupStateLock);
         if (m_quickView) {
             disconnect(m_quickView.get(), &QQuickWindow::frameSwapped,
-                       this, &CompositorDirectComposition::setup);
+                       this, nullptr);
         }
         m_setupState = SetupState::Fail;
         m_setupStateCond.notify_all();


=====================================
modules/gui/qt/maininterface/compositor_dcomp.hpp
=====================================
@@ -75,13 +75,14 @@ protected:
     bool canDoCombinedSurfaceUpdates() const override { return true; };
     void commitSurface() override;
 
+private:
+    [[nodiscard]] bool setup();
+    void cleanup();
+
 private slots:
     void onSurfacePositionChanged(const QPointF& position) override;
     void onSurfaceSizeChanged(const QSizeF& size) override;
 
-    void setup();
-    void cleanup();
-
 protected:
     int windowEnable(const vlc_window_cfg_t *) override;
     void windowDisable() override;



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/27cbfd3877be98698574825771b2af07f14c2f54...11f6b0a3b24b0b2b2edb726fdccedde2313a51d8

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/27cbfd3877be98698574825771b2af07f14c2f54...11f6b0a3b24b0b2b2edb726fdccedde2313a51d8
You're receiving this email because of your account on code.videolan.org. Manage all notifications: https://code.videolan.org/-/profile/notifications | Help: https://code.videolan.org/help




More information about the vlc-commits mailing list